我有大約100萬的記錄,像一個嵌套列表:獲取特定索引的不同值
l = [['a', 'b', 'c', ...], ['d', 'b', 'e', ...], ['f', 'z', 'g', ...],...]
我想獲得第二個索引內列出的不同的價值觀,讓自己最終名單是像:
resultant = ['b', 'z', ...]
我已經嘗試過嵌套循環,但它不快,任何幫助將不勝感激!
我有大約100萬的記錄,像一個嵌套列表:獲取特定索引的不同值
l = [['a', 'b', 'c', ...], ['d', 'b', 'e', ...], ['f', 'z', 'g', ...],...]
我想獲得第二個索引內列出的不同的價值觀,讓自己最終名單是像:
resultant = ['b', 'z', ...]
我已經嘗試過嵌套循環,但它不快,任何幫助將不勝感激!
這對你有用嗎?
result = set([inner_list[1] for inner_list in l])
既然你想要的獨特的項目,你可以爲了保持秩序和獨特的項目(因爲使用哈希表來回回鍵),並使用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']
我可以考慮兩個選項。
套裝理解:
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
唯一值。
可以解壓名單列表,然後選擇與集中的第二元組象下面這樣: 該代碼取4.05311584473e-06 millseconds,在我的筆記本電腦
list(set(zip(*lst)[1]))
輸入:
lst = [['a', 'b', 'c'], ['d', 'b', 'e'], ['f', 'z', 'g']]
輸出:
['b', 'z']
但這應該是獨一無二的.... –
添加鑄造到se噸我的答案。 – grael
是......同意!!! –