2014-06-06 63 views
-1

我有一個列表如下;根據元素的位置從列表創建新的列表

['US', 20, 'en', 'UK', 21, 'en', 'Fra', 23, 'fr'] 

哪個是最有效的方式來創建3上面這樣的新列表?

['US', 'UK', 'Fra'] 
[20, 21, 23] 
['en', 'en', 'fr'] 
+2

我沒有downvote,但問題很可能downvoted因爲它是一個虛擬複製 - 也就是說,它不會需要大量的搜索提供答案,而不是問這個問題的。 – aestrivex

+1

Downvotes通常是缺乏研究的結果。你有沒有嘗試過自己,並確定它對你的需求來說太慢了? – chepner

+0

我知道的唯一方法是運行循環並獲取新列表。我猜它是一個facepalm問題。但仍然... – richie

回答

1

在單(有趣)線:

>>> l = ['US', 20, 'en', 'UK', 21, 'en', 'Fra', 23, 'fr'] 
>>> lists = [[l[3*i+j] for i in range(0, int(len(l)/3))] for j in range(0, 3)] 
>>> lists 
[['US', 'UK', 'Fra'], [20, 21, 23], ['en', 'en', 'fr']] 

你一定要採取lists[0]lists[1]lists[2]

+2

內部列表'[l [i + j]我在範圍內(0,len(l),3)]'更清晰 – njzk2

+0

是的!我沒有意識到範圍函數的第三個參數。 – julienc

1

您可以使用numpy

import numpy as np 
DATA = ['US', 20, 'en', 'UK', 21, 'en', 'Fra', 23, 'fr'] 
x= np.array(DATA).reshape(3,len(DATA)/3).T.tolist() 

print x[0] 
print x[1] 
print x[2] 

它打印

['US', 'UK', 'Fra'] 
['20', '21', '23'] 
['en', 'en', 'fr'] 
0

這不是最有效的方式,但你可以用切片與步參數,實現使它非常易於理解:

>>> l = ['US', 20, 'en', 'UK', 21, 'en', 'Fra', 23, 'fr'] 
>>> l[::3] 
['US', 'UK', 'Fra'] 
>>> l[1::3] 
[20, 21, 23] 
>>> l[2::3] 
['en', 'en', 'fr'] 
+0

或者實際創建請求的列表,[[l [:: 3],l [1 :: 3],l [2 :: 3]]' – aestrivex

+0

@aestrivex這個問題只提到了創建三個列表,而不是列表名單。 –

+0

對不起,你是對的我不知何故誤解了它 – aestrivex

2

切片和清單理解應該做的伎倆。它可能不是最有效的,但它簡潔易讀。

data = ['US', 20, 'en', 'UK', 21, 'en', 'Fra', 23, 'fr'] 
result = [ data[i::3] for i in range(3) ] 
相關問題