在嵌套列表中获取特定的索引不同值

时间:2016-08-25 10:46:14

标签: python nested-lists

我有一个大约100万条记录的嵌套列表,如:

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

我想在第二个索引上获取内部列表的不同值,以便我的结果列表如下:

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

我尝试过嵌套循环,但速度不快,任何帮助都会受到赞赏!

4 个答案:

答案 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只获取唯一值。