在Python中搜索嵌套列表

1 投票
4 回答
2104 浏览
提问于 2025-04-16 19:54

我有一个包含97510个值的嵌套元组列表,像这样:

a = [ (1,2,3), (3,4,5), (5,4,2)]

每个元组的第一个值(索引为0)都是唯一的,我需要找到其他索引为0的项,它们的索引为1的项是相同的。举个例子,我需要找到第二个和第三个元组,因为它们的第二个项'4'是相同的。

我该怎么做呢?

4 个回答

1

请注意,你也可以使用 groupby

from itertools import groupby

data = [ (1,2,3), (3,4,5), (5,4,2)]
res = groupby(sorted(data), key=lambda x: x[1])

根据评论进行了编辑

我对这个问题进行了尝试,发现了另外一个解决方案——虽然不是最好的,但也可以:

inputVals = [(1,2,3), (3,4,5), (5,4,2), (2,2,3), (7,3,1)]
for val in set(x[1] for x in inputVals):   
    print val, list(set(sval for sval in inputVals if sval[1] == val))
3

这里有一种方法可以做到:

>>> result = defaultdict(list)
>>> for item in a:
>>>     result[item[1]].append(item)
>>> result
defaultdict(<type 'list'>, {2: [(1, 2, 3)], 4: [(3, 4, 5), (5, 4, 2)]})

这样做会得到一个字典,里面的每个键对应一个列表,所有第二个值相同的项目都会放在同一个列表里,那个值就是这个列表的键。

4

如果你想找到所有匹配的项:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for inner in a:
...     d[inner[1]].append(inner)
... 
>>> d
defaultdict(<type 'list'>, {2: [(1, 2, 3)], 4: [(3, 4, 5), (5, 4, 2)]})
>>> d[4]
[(3, 4, 5), (5, 4, 2)]

如果你想挑选出某个特定值的所有匹配项:

>>> filter(lambda inner: inner[1] == 4, a)
[(3, 4, 5), (5, 4, 2)]

编辑:正如评论中提到的,使用列表推导式更好,因为它在这类工作中更有效率:

>>> [inner for inner in a if inner[1] == 4]
[(3, 4, 5), (5, 4, 2)]

使用 timeit 测试显示,列表推导式的速度大约快2.5倍(至少在我的机器上是这样):

>>> timeit.timeit('[inner for inner in a if inner[1] == 4]', 'a=[(1,2,3), (3,4,5), (5, 4, 2)]')
2.5041549205780029
>>> timeit.timeit('filter(lambda inner: inner[1] == 4, a)', 'a=[(1,2,3), (3,4,5), (5, 4, 2)]')
6.328679084777832

撰写回答