python数据类型之列表
目录
1.创建列表
2.列表基础操作
常用操作
对列表元素顺序随机打乱
列表下标和切片
字符串分割为列表
列表位移
列表切片替换
3.列表内置方法
4.列表排序
简单排序
使用key参数按指定规则排序
二维列表排序
自定义排序规则函数
5.列表排序算法
选择排序
柱状图动画展示插入排序
插入排序
柱状图动画展示插入排序
6.列表查找算法
线性查找
二分查找
7.引用、浅拷贝和深拷贝
引用(地址相同)
浅拷贝和深拷贝
列表作为函数参数注意事项
注意列表作为实参传递给函数形参是引用
用深浅拷贝处理列表参数
8.多维列表
二维列表:矩阵
三维列表
1.创建列表
用list方法创建
list1 = list() # 创建一个空列表
list2 = list([2, 3, 4])
list3 = list(["red", "green", "blue"])
list4 = list(range(3, 6))
list5 = list("abcd")
list1 = []
list2 = [2, 3, 4]
list3 = ["red", "green"]
list4 = [2, "red", 4] # 列表中可以包含不同类型的元素
list5 = [x for x in range(5)]
list6 = list3 = [x**2 for x in list2 if x < 3]
list6 = [[x, x+1, x**2] for x in list2 if x % 2 == 1]
mylist = [[x, y] for x in range(0, 10, 2) for y in range(1, 10, 2)] # 生成矩阵
mylist = [[2*x, y+1] for x in range(0, 10, 2) for y in range(1, 10, 2) if x % 2 == 0and y % 2 != 0]
2.列表基础操作
常用操作
对列表元素顺序随机打乱
import randomlist1 = [1, 2, 3, 4, 5]
random.shuffle(list1)
print(list1) # [4, 5, 2, 1, 3]
列表下标和切片
和字符串类似
myList[-1] = myList[-1 + len(myList)]
注意避免因 < 和 <= 的使用不当造成列表的“越级访问”,就是超过列表长度的访问,它会出现一个运行时的“IndexError”
示例代码
lst = [1, 2, 3, 4, 5]
print(lst[10])
结果报错
IndexError: list index out of range
考虑对“IndexError”异常的处理
lst = [1, 2, 3, 4, 5]
try:print(lst[10])
except IndexError:print("索引越界")
字符串分割为列表
string = "name xxx ttt"
list1 = string.split() # 默认用空格分隔
print(list1) # ['name', 'xxx', 'ttt']items = "09/17/2020".split("/") # 用/分割
print(items) # ['09', '17', '2020']s1 = "welcome"
list2 = s1.split("o") # 用o分割
print(list2) # ['welc', 'me']
列表位移
def left_shift(lst):temp = lst[0]for i in range(1, len(lst), 1):lst[i - 1] = lst[i]lst[len(lst) - 1] = tempdata = [1, 2, 3, 4]
left_shift(data)
print(data) # [2, 3, 4, 1]
右移
def right_shift(lst):temp = lst[len(lst) - 1]for i in range(len(lst) - 1, 0, -1):lst[i] = lst[i - 1]lst[0] = tempdata = [1, 2, 3, 4]
right_shift(data)
print(data) # [4, 1, 2, 3]
或者这样
data = [1, 2, 3, 4]# 左移
num = 1
lst = data[num:] + data[:num]
print(lst) # [2, 3, 4, 1]# 右移
num = 1
lst = data[-num:] + data[:-num]
print(lst) # [4, 1, 2, 3]
列表切片替换
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst[0:2] = [0, 0]
print(lst) # [0, 0, 3, 4, 5, 6, 7, 8, 9]
替换注意事项:多增少减
# 多增例子
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst[0:2] = [0, 0, 0, 0, 0]
print(lst) # [0, 0, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9]# 少减例子
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst[0:7] = [0, 0, 0]
print(lst) # [0, 0, 0, 8, 9]
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst[0:7:2] = [0, 0, 0] # 0:7:2为0 2 4 6共4个数,[0, 0, 0]为3个数
"""
会报错
ValueError: attempt to assign sequence of size 3 to extended slice of size 4
"""
3.列表内置方法
方法 | 作用 |
append(x: object): None | 将元素添加到列表结尾 |
count(x: object): int | 返回元素x在列表中的出现次数 |
extend(lst: list): None | 将lst中的所有元素追加到列表中 |
insert(index: int, x:object): None | 将元素x插入列表中指定下标处。 注意列表第一个元素的下标是0 |
pop(index): object | 删除给定位置处的元素并返回它。 参数index是可选的,如果没有指定它 那么list.pop()将删除列表最后一个元素并返回它 |
remove(x: object): None | 删除列表中第一次出现的x |
reverse(): None | 将列表中的所有元素倒序 |
sort(): None | 以升序对列表中的元素排序 |
示例代码
data = [x for x in range(5)]
print(data) # [0, 1, 2, 3, 4]# append方法
data.append(100)
print(data) # [0, 1, 2, 3, 4, 100]# count方法
data.append(100)
print(data) # [0, 1, 2, 3, 4, 100, 100]
print(data.count(100)) # 2
print(data.count(99)) # 0# extend方法
data.extend([10, 20, 30])
print(data) # [0, 1, 2, 3, 4, 100, 100, 10, 20, 30]# insert方法
data.insert(1, 9999)
print(data) # [0, 9999, 1, 2, 3, 4, 100, 100, 10, 20, 30]
data.insert(-1, 9999)
print(data) # [0, 9999, 1, 2, 3, 4, 100, 100, 10, 20, 9999, 30]
data.insert(100, 9999)
print(data) # [0, 9999, 1, 2, 3, 4, 100, 100, 10, 20, 9999, 30, 9999]# pop方法
ret = data.pop(1)
print(ret) # 9999
print(data) # [0, 1, 2, 3, 4, 100, 100, 10, 20, 9999, 30, 9999]
data.pop()
print(data) # [0, 1, 2, 3, 4, 100, 100, 10, 20, 9999, 30]# data.pop(100) # IndexError: pop index out of range# remove方法
data.remove(0)
print(data) # [1, 2, 3, 4, 100, 100, 10, 20, 9999, 30]
# data.remove(666) # ValueError: list.remove(x): x not in list# reverse方法
data.reverse()
print(data) # [30, 9999, 20, 10, 100, 100, 4, 3, 2, 1]# sort方法
data.sort()
print(data) # [1, 2, 3, 4, 10, 20, 30, 100, 100, 9999]data = [30, 9999, 20, 10, 100, 100, 4, 3, 2, 1]
data.sort()
data.reverse()
print(data) # [9999, 100, 100, 30, 20, 10, 4, 3, 2, 1]
4.列表排序
简单排序
# 升序
data = [30, 9999, 20, 10, 100, 100, 4, 3, 2, 1]
data.sort()
print(data) # [1, 2, 3, 4, 10, 20, 30, 100, 100, 9999]# 降序
data = [30, 9999, 20, 10, 100, 100, 4, 3, 2, 1]
data.sort()
data.reverse()
print(data) # [9999, 100, 100, 30, 20, 10, 4, 3, 2, 1]
使用key参数按指定规则排序
# 按照元素第一个元素排序
data = ['apple', 'watermelon', 'orange', 'lemon']
data.sort(key=lambda x: x[1])
print(data) # ['watermelon', 'lemon', 'apple', 'orange'] # 按照元素长度排序
data = ['apple', 'watermelon', 'orange', 'lemon']
data.sort(key=lambda x: len(x))
print(data) # ['apple', 'lemon', 'orange', 'watermelon']# 按照元素长度排序的简洁写法
data = ['apple', 'watermelon', 'orange', 'lemon']
data.sort(key=len)
print(data) # ['apple', 'lemon', 'orange', 'watermelon']# 按照元素第一个元素排序,降序
data = ['apple', 'watermelon', 'orange', 'lemon']
data.sort(key=lambda x: x[1], reverse=True)
print(data) # ['orange', 'apple', 'lemon', 'watermelon']
二维列表排序
按照每个子列表的第一个元素升序、第二个元素降序进行排序
# 二维列表
data = [[3, 1, 'apple'],[1, 2, 'orange'],[2, 5, 'banana'],[1, 3, 'grape']
]# 按照每个子列表的第一个元素升序、第二个元素降序进行排序
sorted_list = sorted(data, key=lambda x: (x[0], -x[1]))
# data.sort(key=lambda x: (x[0], -x[1]))# 打印排序后的结果
for item in sorted_list:print(item)# [1, 3, 'grape']
# [1, 2, 'orange']
# [2, 5, 'banana']
# [3, 1, 'apple']
自定义排序规则函数
例子1:按照第一个元素排序,如果第一个元素相同,则按照第二个元素排序
# 定义一个比较函数,用于排序
def custom_sort(item):# 按照第一个元素排序first_element = item[0]# 如果第一个元素相同,则按照第二个元素排序second_element = item[1]return first_element, second_element# 你的二维列表
data = [[3, 'apple', 'a'],[1, 'orange', 'b'],[2, 'banana', 'c'],[1, 'grape', 'd'],[3, 'pear', 'e']
]# 使用sorted函数进行排序,传递自定义的比较函数
sorted_list = sorted(data, key=custom_sort)# 输出排序后的结果
for x in sorted_list:print(x)# [1, 'grape', 'd']
# [1, 'orange', 'b']
# [2, 'banana', 'c']
# [3, 'apple', 'a']
# [3, 'pear', 'e']
例子2:如果第一个元素相同,则按照第二个元素降序排序
# 定义一个比较函数,用于排序
def custom_sort(item):# 按照第一个元素升序排序first_element = item[0]# 按照第二个元素降序排序second_element = item[1]return first_element, -ord(second_element[0])# 你的二维列表
data = [[3, 'apple'],[1, 'orange'],[2, 'banana'],[1, 'grape'],[3, 'pear']
]# 使用sorted函数进行排序,传递自定义的比较函数
sorted_list = sorted(data, key=custom_sort)# 输出排序后的结果
for x in sorted_list:print(x)
"""
[1, 'orange']
[1, 'grape']
[2, 'banana']
[3, 'pear']
[3, 'apple']
"""
5.列表排序算法
选择排序
- 该算法的思路是先将第一个元素作为最小元素,然后依次将它后面所有元素与它比较,若比它小,则并将其交换(这样一来最小的元素将被排在第一个位置)
- 然后将第二个元素作为最小元素,跟上面一样,将它后面所有元素与它比较,若比它小,则并将其交换(这样一来第2小的元素将被排在第二个位置)
- 循环到只剩一个元素
def selectionSort(lst):for i in range(len(lst) - 1):currentMin = lst[i]currentMinIndex = ifor j in range(i + 1, len(lst)):if currentMin > lst[j]:currentMin = lst[j]currentMinIndex = jif currentMinIndex != i:lst[currentMinIndex] = lst[i]lst[i] = currentMindef main():lst = [1, 9, 4.5, 10.6, 5.7, -4.5]selectionSort(lst)print(lst)main() # [-4.5, 1, 4.5, 5.7, 9, 10.6]
柱状图动画展示插入排序
# 柱状图:选择排序动画
from tkinter import *
import tkinter.messagebox
import randomclass StepControl:def __init__(self):self.list = [x for x in range(1, 20 + 1)]self.reset()def reset(self):self.i = -1self.done = Falserandom.shuffle(self.list)self.drawAStep()def step(self):if self.done:tkinter.messagebox.showinfo("showinfo", "列表已经排好升序")return # 没有这个 return 的话消息框要点两次才会消失if self.i == -1:self.i += 1self.drawAStep()if self.i >= len(self.list) - 1:self.done = Truetkinter.messagebox.showinfo("showinfo", "列表已经排好升序")else:currentMin = self.list[self.i]currentIndex = self.ifor j in range(self.i + 1, len(self.list)):if self.list[j] < currentMin:currentMin = self.list[j]currentIndex = jif currentIndex != self.i:self.list[currentIndex] = self.list[self.i]self.list[self.i] = currentMinself.i += 1def drawAStep(self):bottomGap = 10canvas.delete("line")canvas.create_line(10, height - bottomGap, width - 10, height - bottomGap, tags = "line")barWidth = (width - 20) / len(self.list)maxCount = int(max(self.list))for i in range(len(self.list)):canvas.create_rectangle(10 + i * barWidth,(height - bottomGap) * (1 - self.list[i] / (maxCount + 4)),10 + (i + 1) * barWidth,height - bottomGap, tags = "line")canvas.create_text(10 + i * barWidth + barWidth / 2,(height - bottomGap) * (1 - self.list[i] / (maxCount + 4)) - 8,text = str(self.list[i]), tags = "line")if self.i >= 0:canvas.create_rectangle(10 + self.i * barWidth,(height - bottomGap) * (1 - self.list[self.i] / (maxCount + 4)),10 + (self.i + 1) * barWidth,height - bottomGap, fill = "red", tags="line")def step():control.step()def reset():control.reset()window = Tk()
window.title("选择排序动画")width = 340
height = 150canvas = Canvas(window, width=width, height=height, )
canvas.pack()frame = Frame(window)
frame.pack()Button(frame, text="Step", command=step).pack(side=LEFT)
Button(frame, text="Reset", command=reset).pack(side=LEFT)control = StepControl()
control.drawAStep()window.mainloop()
插入排序
def insertionSort(lst):for i in range(1, len(lst)):currentValue = lst[i]k = i - 1while k >= 0 and lst[k] > currentValue:lst[k + 1] = lst[k]k -= 1lst[k + 1] = currentValuedef main():lst = [1, 9, 4.5, 10.6, 5.7, -4.5]insertionSort(lst)print(lst) # [-4.5, 1, 4.5, 5.7, 9, 10.6]main()
柱状图动画展示插入排序
# 柱状图:插入排序动画
from tkinter import *
import tkinter.messagebox
import randomclass StepControl:def __init__(self, width, height, canvas):self.width = widthself.height = heightself.canvas = canvasself.list = [x for x in range(1, 20 + 1)]self.reset()def reset(self):self.i = -1self.done = Falserandom.shuffle(self.list)self.drawAStep()def start(self):if self.done:tkinter.messagebox.showinfo("showinfo", "列表已经排好升序")return # 没有这个 return 的话消息框要点两次才会消失if self.i == -1:self.i += 1self.drawAStep()if self.i >= len(self.list) - 1:self.done = Truetkinter.messagebox.showinfo("showinfo", "列表已经排好升序")else:self.i += 1currentValue = self.list[self.i]k = self.i - 1while k >= 0 and self.list[k] > currentValue:self.list[k + 1] = self.list[k]k -= 1self.list[k + 1] = currentValuedef drawAStep(self):width = self.widthheight = self.heightcanvas = self.canvasbottomGap = 10barWidth = (width - 20) / len(self.list)maxCount = int(max(self.list))canvas.delete("line")canvas.create_line(10, height - bottomGap, width - 10, height - bottomGap, tags = "line")for i in range(len(self.list)):canvas.create_rectangle(10 + i * barWidth, (height - bottomGap) * (1 - self.list[i] / (maxCount + 4)),10 + (i + 1) * barWidth, (height - bottomGap),tags = "line")canvas.create_text(10 + i * barWidth + barWidth / 2,(height - bottomGap) * (1 - self.list[i] / (maxCount + 4)) - 8,text = str(self.list[i]), tags="line")if self.i >= 0:canvas.create_rectangle(10 + self.i * barWidth,(height - bottomGap) * (1-self.list[self.i]/(maxCount+4)),10 + (self.i + 1) * barWidth,height - bottomGap,fill="red", tags="line")# 定义窗体类:来展示主界面窗口
class Window:def __init__(self):self.window = Tk()self.window.title("插入排序动画")self.window.geometry("600x400+0+0")self.width = 340self.height = 150self.canvas = Canvas(self.window, width= self.width, height=self.height)self.canvas.pack()#################################self.control = StepControl(self.width, self.height, self.canvas) # 类中创建类#################################self.frame = Frame(self.window)self.frame.pack()Button(self.frame, text="Start", command=self.start).pack(side=LEFT)Button(self.frame, text="Reset", command=self.reset).pack(side=LEFT)self.window.mainloop()def start(self):self.control.start()def reset(self):self.control.reset()Window()
6.列表查找算法
线性查找
# -*- coding: utf-8 -*-def linear_search(lst, key):result = []for i in range(len(lst)):if key == lst[i]:result.append(i)return resultdata = [1, 3, 4, 2, 4, -3, 6, 2]a = linear_search(data, 4)
b = linear_search(data, -4)
c = linear_search(data, 3)print(a) # [2, 4]
print(b) # []
print(c) # [1]
二分查找
工作原理是,从数组的中间元素开始比较,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到该元素。二分查找的每一次比较都使搜索范围缩小一半,因此其效率较高。
二分查找的时间复杂度是O(log n),其中n是数组中的元素数量。这意味着在最坏的情况下,需要比较的次数与数组的深度(以2为底数)成对数关系。
# -*- coding: utf-8 -*-def binary_search(lst, key):low = 0high = len(lst) - 1while high >= low:mid = (low + high) // 2if key < lst[mid]:high = mid - 1elif key > lst[mid]:low = mid + 1else:return midreturn -(low + 1)# –(low + 1)中“-”表示查找不到这个元素,“low + 1”表示应该插入的位置,low + 1 = 1 话表示索引为 0 的位置
data = [1, 3, 4, 2, 4, -3, 6, 2]
data.sort()
print(data) # [-3, 1, 2, 2, 3, 4, 4, 6]i = binary_search(data, 4)
j = binary_search(data, -4)
k = binary_search(data, 3)
print(i) # 5
print(j) # -1
print(k) # 4
7.引用、浅拷贝和深拷贝
引用(地址相同)
引用就是与原来变量为同一个内存地址
在python列表中,用=号复制的列表的 id 与原列表相同
# -*- coding: utf-8 -*-lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
print(id(lst1) == id(lst2)) # False 说明地址不同lst2 = lst1
print(id(lst1) == id(lst2)) # True 现在lst2 和lst1指向同一块地址
print(lst1) # [1, 2, 3]
print(lst2) # [1, 2, 3]# 现在修改lst1,然后查看lst2是否会变化
lst1[0] = 99
print(lst1) # [99, 2, 3]
print(lst2) # [99, 2, 3]
浅拷贝和深拷贝
- 浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
- 深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。
# -*- coding: utf-8 -*-lst = [1, 2, 3, 4, 5]
lst1 = lst # 引用
lst2 = lst.copy() # 浅拷贝:保证第一层不会被改变print(id(lst) == id(lst1)) # True
print(id(lst) == id(lst2)) # False
print(id(lst1) == id(lst2)) # Falselst[3] = 10000
print(lst) # [1, 2, 3, 10000, 5]
print(lst1) # [1, 2, 3, 10000, 5]
print(lst2) # [1, 2, 3, 4, 5]
# -*- coding: utf-8 -*-import copylst = [[1, 2], [3, 4]]
lst1 = lst.copy() # 浅拷贝
lst2 = copy.deepcopy(lst) # 深拷贝print(id(lst), id(lst1), id(lst2))
# 2096876497224 2096876497160 2096876497096lst[0][0] = 100
print(lst) # [[100, 2], [3, 4]]
print(lst1) # [[100, 2], [3, 4]]
print(lst2) # [[1, 2], [3, 4]]
列表作为函数参数注意事项
注意列表作为实参传递给函数形参是引用
列表用=赋值是引用。列表作为形参赋值给形参后,在函数内部若对形参进行了值修改,则原实参那个列表内容会发生改变。这一点需要非常注意,避免在调用函数后原列表发生改变,出现意外错误。
# -*- coding: utf-8 -*-def m(number, numbers):number = 1001numbers[0] = 5555def main():x = 1y = [1, 2, 3]m(x, y)print("x = ", x)print("y[0] = ", y[0])main()
"""
结果
x = 1
y[0] = 5555
注意 x 未发生改变,而列表发生了改变,这是因为 y 和 numbers 都指向同一个列表对象
"""
用深浅拷贝处理列表参数
# -*- coding: utf-8 -*-import copydef test_list(m_list):# 调用函数时test_list(x)就是做了m_list=x这么一个赋值操作m_list[0] = 99return m_listdef test_list2(m_list):temp_list = m_list.copy() # 浅拷贝temp_list[0] = 99return temp_listdef test_list3(m_list):temp_list = m_list.copy() # 浅拷贝print(temp_list)temp_list[1] = [7, 8, 9] # 改变第一层的值temp_list[0][0] = 88 # 改变第二层的值return temp_listdef test_list4(m_list):temp_list = copy.deepcopy(m_list) # 深拷贝print(temp_list)temp_list[1] = [7, 8, 9] # 改变第一层的值temp_list[0][0] = 88 # 改变第二层的值return temp_listif __name__ == "__main__":# 1.列表赋值是引用,与原列表是同一个对象x = [1, 2, 3]y = xx[0] = 100print(y) # [100, 2, 3]print(id(x) == id(y)) # True # 地址相同说明是同一个对象# 2.函数将实参传递给形参时是赋值x = [1, 2, 3]re_list = test_list(x)print(re_list) # [99, 2, 3]print(x) # [99, 2, 3]# 3.用浅拷贝解决列表做参数时改变原列表值的问题x = [1, 2, 3]re_list = test_list2(x)print(re_list) # [99, 2, 3]print(x) # [1, 2, 3]# 4.浅拷贝的局限:只能保证第一层不会变x = [[1, 2, 3], [4, 5, 6]]re_list = test_list3(x)print(re_list) # [[88, 2, 3], [7, 8, 9]]print(x) # [[88, 2, 3], [4, 5, 6]]# 5.用深拷贝保证所有层都不变x = [[1, 2, 3], [4, 5, 6]]re_list = test_list4(x)print(re_list) # [[88, 2, 3], [7, 8, 9]]print(x) # [[1, 2, 3], [4, 5, 6]]
8.多维列表
二维列表:矩阵
# -*- coding: utf-8 -*-from random import randintmatrix = []
number_of_rows = 3
number_of_columns = 3for row in range(number_of_rows):matrix.append([])for column in range(number_of_columns):# value = eval(input("请输入矩阵第{}行第{}列的值:".format(row, column)))value = randint(0, 99)matrix[row].append(value)print(matrix)
# -*- coding: utf-8 -*-# 可以这样
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for row in range(len(matrix)):for column in range(len(matrix[row])):print(matrix[row][column], end=" ")print()# 也可以这样
for row in matrix:for value in row:print(value, end=" ")print()
二维列表求和
# -*- coding: utf-8 -*-# 对所有元素求和
def sum_matrix(matrix):total = 0for row in matrix:for value in row:total += valuereturn total# 按列求和
def sum_matrix_column(matrix):sum_column_list = []for column in range(len(matrix[0])):sum_column = 0for row in range(len(matrix)):sum_column += matrix[row][column]sum_column_list.append(sum_column)return sum_column_list# 找出和最大的行
def max_sum_row(matrix):max_value = sum(matrix[0])max_index = 0for row in range(1, len(matrix)):if sum(matrix[row]) > max_value:max_value = sum(matrix[row])max_index = rowreturn max_value, max_indexdata = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(sum_matrix(data)) # 45
print(sum_matrix_column(data)) # [12, 15, 18]
print(max_sum_row(data)) # (24, 2)
# -*- coding: utf-8 -*-from random import randintdef shuffle_matrix(matrix):for row in range(len(matrix)):for column in range(len(matrix[row])):i = randint(0, len(matrix) - 1)j = randint(0, len(matrix[row]) - 1)matrix[row][column], matrix[i][j] = matrix[i][j], matrix[row][column]data = [[1,2,3], [4,5,6], [7,8,9]]
shuffle_matrix(data)
print(data)
# -*- coding: utf-8 -*-data = [[8, 1, 3], [6, 7, 4], [6, 3, 4], [9, 5, 2]]
data.sort()
print(data) # [[6, 3, 4], [6, 7, 4], [8, 1, 3], [9, 5, 2]]
可以看到它像一维列表排序一样,将每个元素(列表)比较大小,比如[8, 1, 3]和[6, 7, 4],从第一个元素依次比较,直到分出大小。
但是我们有时想按指定规则排序,参考前面的列表排序。
grid = [['.', '.', '.', '.', '.', '.'],['.', 'O', 'O', '.', '.', '.'],['O', 'O', 'O', 'O', '.', '.'],['O', 'O', 'O', 'O', 'O', '.'],['.', 'O', 'O', 'O', 'O', 'O'],['O', 'O', 'O', 'O', 'O', '.'],['O', 'O', 'O', 'O', '.', '.'],['.', 'O', 'O', '.', '.', '.'],['.', '.', '.', '.', '.', '.']
]def transpose(matrix):new_matrix = [[0]*len(matrix) for i in range(len(matrix[0]))]# print(new_matrix)for column in range(len(matrix[0])):for row in range(len(matrix)):print(matrix[row][column], end="")new_matrix[column][row] = matrix[row][column]print()return new_matrixnew_grid = transpose(grid)
print("----------------------------")
for item in new_grid:print(item)"""
..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....
----------------------------
['.', '.', 'O', 'O', '.', 'O', 'O', '.', '.']
['.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.']
['.', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '.']
['.', '.', 'O', 'O', 'O', 'O', 'O', '.', '.']
['.', '.', '.', 'O', 'O', 'O', '.', '.', '.']
['.', '.', '.', '.', 'O', '.', '.', '.', '.']
"""
三维列表
end