1

我有一个嵌套的 97510 个值的元组列表,如下所示:

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

每个第一个值 (index=0) 都是唯一的,我需要找到具有相同 index=1 项的其他 index=0 项在示例中,我需要找到第二项“4”所在的第二个和第三个元组常见的 。

我该怎么做 ?

4

4 回答 4

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
于 2011-06-20T11:03:28.537 回答
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)]})

这将产生一个列表字典,其中具有相同第二个值的所有项目都在一个列表中,该值作为键。

于 2011-06-20T10:59:21.207 回答
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))
于 2011-06-20T11:35:50.940 回答
1

另一种选择:

from operator import itemgetter
from itertools import groupby

a = [ (1,2,3), (3,4,5), (5,4,2)]
b = groupby(sorted(a), itemgetter(1))
for val, group in b:
    print val, list(group)
# 2 [(1, 2, 3)]
# 4 [(3, 4, 5), (5, 4, 2)]
于 2011-06-20T11:36:35.057 回答