2016-09-29 60 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]]