如何在Python中提取列表中的重复元组?

4
我是一名程序员,需要编写一个程序来查找相同的日期……目前我将日期分别存储在不同的列表中,包括天和月,然后使用zip函数将它们合并为日期列表。因此,日期列表可能如下所示:
[(2,4),(4,18),(10,7)]

我的问题是,我需要将重复的元组提取到另一个列表中,而不仅仅是用一些set()之类的方法消除它们。
如果我的日期列表是[(2,3),(2,3),(4,8)],我需要将(2,3)放入新列表中。
或者,我可以将日期列表转换成一个字典,然后再将其拼成项,但我想知道是否有更简单的方法。有什么建议吗?
3个回答

6
您可以使用计数器来完成此任务:
>>> from collections import Counter
>>> L = [(2,3),(2,3),(4,8)]
>>> [k for k,count in Counter(L).items() if count > 1]
[(2, 3)]

如果您想要所有的重复项,而不是每个键只保留一个,则需要同时使用计数和键。
如果您关心原始顺序,请使用OrderedCounter 来完成相同的操作。
>>> from collections import Counter, OrderedDict
>>> class OrderedCounter(Counter, OrderedDict): 
...     pass

我不在意顺序,所以只需要计数器就可以了!干杯! - agios

2

您可以使用列表推导式collections.Counter来实现:

>>> from collections import Counter
>>> my_list = [(2,3),(2,3),(4,8)]

>>> my_counter = Counter(my_list)
>>> [k for k, v in my_counter.items() if v>1]
[(2, 3)]

作为替代方案,您也可以使用set()list.count()一起使用来获得所需的结果(注意:此方法效率较低):
>>> my_set = set(my_list)  # To get unique tuples
#            count of each tuple  v
>>> [t for t in my_set if my_list.count(t) > 1]
[(2, 3)]

1
你可以使用.count()来获取列表中每个值出现的次数,并将其添加到一个列表中,如果该值大于>1
[date for date in dates if dates.count(date)>1]

你可以使用set()方法从中删除重复项,并将其转换为list
new_list=list(set([date for date in dates if dates.count(date)>1]))

输出:

[(2,3)]

这段代码运行时间为二次方,所以我认为不是一个理想的解决方案。 - Georg Schölly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接