2016-08-25 86 views
2

我有大約100萬的記錄,像一個嵌套列表:獲取特定索引的不同值

l = [['a', 'b', 'c', ...], ['d', 'b', 'e', ...], ['f', 'z', 'g', ...],...] 

我想獲得第二個索引內列出的不同的價值觀,讓自己最終名單是像:

resultant = ['b', 'z', ...] 

我已經嘗試過嵌套循環,但它不快,任何幫助將不勝感激!

回答

0

這對你有用嗎?

result = set([inner_list[1] for inner_list in l]) 
+0

但這應該是獨一無二的.... –

+0

添加鑄造到se噸我的答案。 – grael

+1

是......同意!!! –

1

既然你想要的獨特的項目,你可以爲了保持秩序和獨特的項目(因爲使用哈希表來回回鍵),並使用zip()獲得第二個項目使用collections.OrderedDict.fromkeys()

from collections import OrderedDict 

list(OrderedDict.fromkeys(zip(my_lists)[2])) 

在Python 3.x都有因爲zip()返回一個迭代器,你可以這樣做:

colls = zip(my_lists) 
next(colls) 
list(OrderedDict.fromkeys(next(colls))) 

或者使用內dict.formkeys()生成器表達式:

list(OrderedDict.fromkeys(i[1] for i in my_lists)) 

演示:

>>> lst = [['a', 'b', 'c'], ['d', 'b', 'e'], ['f', 'z', 'g']] 
>>> 
>>> list(OrderedDict().fromkeys(sub[1] for sub in lst)) 
['b', 'z'] 
0

我可以考慮兩個選項。

套裝理解:

res = {x[1] for x in l} 

我覺得numpy的陣列的工作比列表/套內涵比較快,所以這個列表轉換爲一個數組,然後使用陣列功能可以更快。這裏:

import numpy as np 

res = np.unique(np.array(l)[:, 1])  

讓我解釋:np.array(l)列表轉換成一個二維數組,然後[:, 1]採取第二列(開始從0計數)由原始l每個子表的第二項,以及最後只使用np.unique唯一值。

1

可以解壓名單列表,然後選擇與集中的第二元組象下面這樣: 該代碼取4.05311584473e-06 millseconds,在我的筆記本電腦

list(set(zip(*lst)[1])) 

輸入:

lst = [['a', 'b', 'c'], ['d', 'b', 'e'], ['f', 'z', 'g']] 

輸出:

['b', 'z'] 
相關問題