2017-01-17 6 views
4

Я пишу программу, где мне нужно, чтобы найти ту же дату ...Как извлечь дубликаты кортежей из списка в Python?

я в настоящее время хранить даты на разных списках дня и месяц, а затем zip их в список дат ... поэтому список даты может выглядеть что-то вроде этого:

[(2,4),(4,18),(10,7)] 

Моя проблема в том, мне нужно, чтобы извлечь дубликаты кортежей в другой список не только устранить их с некоторыми set() или около того.

Если мой список дат получает [(2,3),(2,3),(4,8)] Мне нужно получить (2,3) в новый список.

В качестве альтернативы я мог бы составить список дат в dictionary, а затем снова поместить его в предметы, но я спрашиваю, есть ли более простой способ. Какие-либо предложения?

ответ

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 
+0

Я не забочусь о том порядке, только счетчик будет делать это! Ура! – 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)] 
+0

Этот код работает в квадратичном времени, поэтому не идеальное решение, которое я бы сказал. –