[python] list
一、列表排序
按照第一个元素降序,第二个元素升序排序
a = [[1,2],[3,9],[2,5],[2,6],[2,7]]
a.sort(key=lambda x:(-x[0],x[1]))
有两个list A和B,它们长度相等,元素一一对应,请将A中的元素按照B中的元素大小排序,如果B中的元素相等则再按照A中的元素排序
A = [3, 1, 4, 1]
B = [2, 3, 2, 1]
zipped = list(zip(A, B))
zipped.sort(key=lambda x: (x[1], x[0]))
sorted_A = [x[0] for x in zipped]MOD=10**9+7
二、遍历二维列表的列
1.使用 zip 函数:
- zip 函数可以将多个可迭代对象(如列表)中的元素按索引配对。当应用于二维列表时,它可以有效地转置列表结构,从而实现按列遍历。 - 示例代码如下:
a = [[1, 2], [3, 4]]
for col in zip(*a): for element in col: print(element)
- 在这个代码中, zip(*a) 对列表 a 进行了“转置”操作。 * 是解包操作符,它将 a 中的子列表作为独立的参数传递给 zip 函数。然后,外层 for 循环遍历转置后的每一列(每个元组),内层 for 循环遍历每列中的元素并打印。
2.使用列表推导式实现按列遍历并收集元素:
- 可以通过列表推导式来收集每列的元素到一个新的列表结构中。
- 示例代码如下:
a = [[1, 2], [3, 4]]
columns = [[sub_list[i] for sub_list in a] for i in range(len(a[0]))]
for col in columns: for element in col: print(element)
- 这里外层列表推导式 [ [sub_list[i] for sub_list in a] for i in range(len(a[0]))] 中,内层列表推导式 [sub_list[i] for sub_list in a] 用于收集每一列的元素, i 表示列索引,通过 range(len(a[0])) 来遍历所有列。最后,再通过外层循环遍历每列并打印其中元素。
3.使用 itertools.zip_longest (适用于列长度可能不同的情况):
- 如果你的二维列表中每一行的长度可能不同, itertools.zip_longest 会更合适,它会以最长的可迭代对象为基准,缺失的值用指定的填充值(默认为 None )填充。
- 示例代码如下:
from itertools import zip_longest
a = [[1, 2], [3, 4, 5]]
for col in zip_longest(*a): for element in col: if element is not None:print(element)
- 这里使用 zip_longest 对 a 进行转置,然后遍历转置后的每一列,并且在打印时跳过 None 值(如果存在)。
三、遍历时使用切片
遍历时如果使用切片,那么切片操作得到的新的列表是原列表的一个副本,切片列表的值在创建时就已固定,不受原列表更新的影响,所以获取的是原始值。
a=[1,1,0,0]
for i,c in enumerate(a):if c == 1:a[i+1]+=3a[i+2]+=3print(a)for i,c in enumerate(a[:-1]):if c == 1:a[i+1]+=3a[i+2]+=3print(a)
- 第一种写法只打印一次,第二种写法会打印两次。这是因为第一种写法,在遍历过程中,每一次循环都会从列表 a 最新的状态里获取元素的值。
- 而第二种写法,a[:-1] 是对列表 a 进行切片操作得到的一个新列表,它是原列表 a 除去最后一个元素后的副本。一旦这个切片列表被创建,其中元素的值就固定下来了,不会受到后续对原列表 a 修改的影响。在遍历这个切片列表时,c 的值是从这个固定的切片列表中获取的。所以,当 i = 1 时,c 取的是切片列表中对应位置的原始值 1,而不是原列表 a 中更新后的值。