2016-09-29 177 views
1

假设我有长度为n的若干名单:加入名单的名单“colums”进入名单列表的“行”

a = [1, 2, 3] 
b = [4, 5, 6] 
c = [7, 8, 9] 
d = [-1, -2, -3] 

我把这些列表到一个列表:

x = [a, b, c] 

现在我想结束以下列表:

y = [[1, 4, 7, -1], [2, 5, 8, -2], [3, 6, 9, -3]] 

什么是快速和pythonic的方式来做到这一点? (从xy。)

这些条目可以是任何东西,我只是因为它们形象化好才使用数字。

回答

3

有一种非常简单和pythonic的方式来以这种方式“反向拉链”列表。简单使用zip功能和拆包经营者*

>>> y = zip(*x) 
>>> list(y) 
[(1, 4, 7, -1), (2, 5, 8, -2), (3, 6, 9, -3)] 

有关到底是怎么回事的详细信息,请参阅What is the inverse function of zip in python?

如果是重要的,它是不是名单​​列表的列表,元组,你可以做到以下几点:

>>> [list(i) for i in zip(*x)] 
[[1, 4, 7, -1], [2, 5, 8, -2], [3, 6, 9, -3]] 
+0

不OP想要的清单列表,而不是元组的列表? – MooingRawr

+0

在大多数情况下,我可以想到它应该没有关系,但我也为它添加了代码片段。 – brianpck

3

你可以做到这一点的一行代码:

[[z[i] for z in x] for i in range(len(x[0]))] 

它的作用是遍历所有索引(i),然后遍历xz)中的所有列表并创建一个新列表。

0

您可以尝试zip

>>> result = zip(a,b,c,d) # This gives ans as list of tuples [(1, 4, 7, -1), (2, 5, 8, -2), (3, 6, 9, -3)] 
>>> result_list = [list(elem) for elem in result] #convert list of tuples to list of list 
>>> result_list 
[[1, 4, 7, -1], [2, 5, 8, -2], [3, 6, 9, -3]]