重新有效地分配列表

时间:2013-07-18 14:32:55

标签: python performance list

这是我需要做的重新安排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])

使b lool像这样:

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

即,a中每个列表中的每个第一项都将存储在b的第一个列表中,b中的第二个和第三个列表中的每个项目都相同。

我需要将它应用到一个有点大的a列表中,是否有更有效的方法来执行此操作?

1 个答案:

答案 0 :(得分: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()将多个序列作为参数,并将每个序列中的元素配对以形成新列表。通过使用a splat参数传递*,我们要求Python将a扩展为zip()的单独参数。

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

b = map(list, zip(*a))