名單

2013-10-06 18 views
1

好清單歸來子列表,我有這樣的例子:名單

mylist = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]] 

這是一個列表的列表。我想保留每個子列表的前5個點。如果這是一個簡單的列表,我會打電話給mylist[:5],就這些。現在,我可以想象的最簡單的方法是遍歷mylist並將每個子列表的前5個點複製到新列表中。

newlist = [] 
for i in mylist: 
    newlist.append(i[:5]) 

但是如果我的列表長度爲10.000+會發生什麼。你知道更快的方法嗎?

+1

處理所有你必須......過程中的所有表至少一次的名單。所以沒有比線性'O(n)'更復雜的方法。如果你不需要一次完成所有的結果,你可以編寫一個函數來按需獲取一個特定的子列表。 – BartoszKP

回答

6

那麼,你可以使用列表理解來做同樣的事情,所以至少會縮短一些。

return [x[:5] for x in mylist] 

或者,如果讓你的函數發生器來代替,你也可以得到各個元素:

for x in mylist: 
    yield x[:5] 
+0

我的理解是列表解析比傳統的Python循環更有效,所以它不僅使代碼更短,而且應該更快地執行。 – SethMMorton

0

另一種方式來實現這一目標:

return map(lambda lst: lst[:5], mylist) 
0

您應該使用發電機內部列表以及如果您試圖使過程按比例縮小:

g = lambda k: (k[i] for i in range(5)) 
for x in mylist: 
    yield g(x) 
0

的功能的方法:

map(operator.itemgetter(slice(0, 5)), mylist)