我有一个大约100万条记录的嵌套列表,如:
l = [['a', 'b', 'c', ...], ['d', 'b', 'e', ...], ['f', 'z', 'g', ...],...]
我想在第二个索引上获取内部列表的不同值,以便我的结果列表如下:
resultant = ['b', 'z', ...]
我尝试过嵌套循环,但速度不快,任何帮助都会受到赞赏!
答案 0 :(得分:1)
由于您需要使用collections.OrderedDict.fromkeys()
的唯一项目以保持订单和唯一项目(因为使用哈希表来解决密钥)并使用zip()
来获取第二项。
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']
答案 1 :(得分:1)
你可以解压缩列表列表然后选择第二个元组,如下所示: 这段代码需要4.05311584473e-06毫秒,在我的笔记本电脑中
list(set(zip(*lst)[1]))
输入:
lst = [['a', 'b', 'c'], ['d', 'b', 'e'], ['f', 'z', 'g']]
Out put:
['b', 'z']
答案 2 :(得分:0)
这对你有用吗?
result = set([inner_list[1] for inner_list in l])
答案 3 :(得分:0)
我可以想到两个选择。
理解:
res = {x[1] for x in l}
我认为numpy数组比list / set comprehensions工作得更快,因此将此列表转换为数组然后使用数组函数可以更快。这里:
import numpy as np
res = np.unique(np.array(l)[:, 1])
让我解释一下:np.array(l)
将列表转换为2d数组,然后[:, 1]
取第二列(从0开始计数),其中包含原始{中每个子列表的第二项{1}},最后使用l
只获取唯一值。