重新有效地分配列表

Gab*_*iel 4 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])
Run Code Online (Sandbox Code Playgroud)

这使得blool像这样:

b = [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
Run Code Online (Sandbox Code Playgroud)

即,每个列表中的每个第一项都a将存储在第一个列表中,b并且对于列表2和3中的相同b.

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

Mar*_*ers 14

有一个很多更好的方法来转你的行和列:

b = zip(*a)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

zip()将多个序列作为参数,并将每个序列中的元素配对以形成新列表.通过传递a*图示的说法,我们要求Python来扩展a成独立的参数zip().

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

b = map(list, zip(*a))
Run Code Online (Sandbox Code Playgroud)

  • 简单,简洁,优雅...一句话,Python :) (4认同)