Python 如何从具有相同第二个值的元组列表中获取这些元组?

Python 如何从具有相同第二个值的元组列表中获取这些元组?,python,list,tuples,Python,List,Tuples,我有一个元组列表,如下所示 entities = [('tmp', 'warm'), ('loc', 'blr'), ('cap', 'blr'), ('aps', 'yes'), ('date', '12-10-2018')] 我想存储那些具有相同second值的元组。如您所见,元组('loc','blr')和('cap','blr')具有相同的第二个值 我希望这两个元组存储在一个列表中,以供参考 这是我尝试过的,但没有达到预期效果 duplicate = [] for i in range

我有一个元组列表,如下所示

entities = [('tmp', 'warm'), ('loc', 'blr'), ('cap', 'blr'), ('aps', 'yes'), ('date', '12-10-2018')]
我想存储那些具有相同second值的元组。如您所见,元组
('loc','blr')
('cap','blr')
具有相同的第二个值

我希望这两个元组存储在一个列表中,以供参考

这是我尝试过的,但没有达到预期效果

duplicate = []
for i in range(len(entities)):
    for j in range(1, len(entities)):
        if entities[i][1] == entities[j][1]:
            duplicate.append([entities[i][1], entities[j][1]])
            break
但我得到所有元组,就好像所有元组都有相同的第二个值。我怎样才能做到这一点

所需输出

('loc', 'blr'), ('cap', 'blr')

您可以通过以下方式将具有公共第二个元素的列表组合在一起:

s = sorted(entities, key = lambda x: x[1])
[list(v) for k,v in groupby(s, key=lambda x: x[1])]

[[('date', '12-10-2018')],
 [('loc', 'blr'), ('cap', 'blr')],
 [('tmp', 'warm')],
 [('aps', 'yes')]]

如果性能是考虑使用的问题:

现在,如果您只想保留两个元组有一个公共第二个元素的情况,可以执行以下操作:

[i for i in l if len(i)>1]
[[('loc', 'blr'), ('cap', 'blr')]]

我提出了这个答案,这样你就可以将它扩展到第二位的
n
公共元素,因为你可能有2个以上的元素。

你可以使用dict对这些元组进行分组,以获得更常见的情况

grouped = {}
for k, v in entities:
    grouped[v].setdefault(k, []).append((k, v))
for _, tuples in grouped.items():
    if len(tuples) > 2:
        print(tuples)
具有相同秒值的所有对将分组在不同的键下

您可以使用O(n log n)(需要对输入列表进行预排序),但O(n)已足够:

from collections import Counter
from operator import itemgetter

# construct dictionary mapping second value to count
c = Counter(map(itemgetter(1), entities))

# filter for second values with count > 1
dups = {value for value, count in c.items() if count > 1}

# filter entities with second value in dups
res = [entity for entity in entities if entity[1] in dups]

print(res)
# [('loc', 'blr'), ('cap', 'blr')]

所需输出是什么?@user5173426添加了所需输出Exacly,提示:也可以使用
操作符.itemgetter(1)
来代替lambda。Yes也会添加它,因为它对大型列表的性能更好。谢谢!
from collections import Counter
from operator import itemgetter

# construct dictionary mapping second value to count
c = Counter(map(itemgetter(1), entities))

# filter for second values with count > 1
dups = {value for value, count in c.items() if count > 1}

# filter entities with second value in dups
res = [entity for entity in entities if entity[1] in dups]

print(res)
# [('loc', 'blr'), ('cap', 'blr')]