我有一个元组列表,如下所示
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')
答案 0 :(得分:1)
您可以通过以下方式将具有常见第二个元素的列表分组在一起:
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')]]
如果性能存在问题,请考虑使用operator.itemgetter
:
from operator import itemgetter
s = sorted(entities, key = itemgetter(1))
[list(v) for k,v in groupby(s, key = itemgetter(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个。
答案 1 :(得分:1)
您可以使用O( n log n )itertools.groupby
(需要对输入列表进行预排序),但是O( n )collections.Counter
就足够了:
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')]
答案 2 :(得分:0)
对于更常见的情况,您可以使用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)
所有具有相同第二个值的对将被分组在不同的键下