4

这是MWE我需要做的重新安排:

a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
b = [[], [], []]

for item in a:
    b[0].append(item[0])    
    b[1].append(item[1])
    b[2].append(item[2])

这使得bloo 像这样:

b = [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]

即,内部每个列表中的每个第一项都a将存储在第一个列表中b,对于列表二和三中的列表也是如此b

我需要将此应用于一个有点大的a列表,有没有更有效的方法来做到这一点?

4

1 回答 1

14

有一种更好的方法来转置行和列:

b = zip(*a)

演示:

>>> a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
>>> zip(*a)
[(1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)]

zip()将多个序列作为参数并将每个序列中的元素配对以形成新列表。通过传入splat 参数a*我们要求 Python 扩展azip().

请注意,输出为您提供了一个元组列表;根据需要将元素映射回列表:

b = map(list, zip(*a))
于 2013-07-18T14:34:19.237 回答