2017-01-17 79 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

該代碼運行在二次時間,所以不是我想說的理想解決方案。 –

相關問題