我有一个97510值的元组的嵌套列表,如下所示:
a = [ (1,2,3), (3,4,5), (5,4,2)]
每个第一个值(index = 0)都是唯一的,我需要找到其他index = 0项,它们具有相同的索引= 1项 在这个例子中,我需要找到第二个项目'4'常见的第二个和第三个元组。
我该怎么做?
答案 0 :(得分: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
答案 1 :(得分: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)]})
这将生成一个列表字典,其中具有相同第二个值的所有项目都在一个列表中,并将该值作为键。
答案 2 :(得分: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 :(得分: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)]