2013-04-04 18 views
7

'daki bir listede saklayın. Bunun muhtemelen kolay bir cevap olduğunu biliyorum ama anlayamıyorum.Yinelenenleri Python

x = [1,2,2,2,3,4,5,6,6,7] 

çıkışı olmalıdır:

[2,6] 

Ben bu bağlantıyı bulundu: Ne bir listede çiftleri tutmak için Python en iyi yoldur Find (and keep) duplicates of sublist in python, ama yine de Python nispeten yeni ve basit bir liste için işe yaramayacağım.

+0

konusu yayının bir gömlekleri birini denediniz mi? –

+0

Siparişi korumanız mı gerekiyor? – DSM

+0

@DSM - Aynı şeyi düşündüğümüz anlaşılıyor ... – mgilson

cevap

8

liste zaten sıralanmış, bu bunu yapmak için kısa bir yol olduğunu:

x = [1,2,2,2,3,4,5,6,6,7] 

from itertools import groupby 
print [key for key,group in groupby(x) if len(list(group)) > 1] 
+1

Bu ayrıca benim ile bir sorun olan python2.6 ile çalışacaktır. – mgilson

+0

bu, sıralanmamış bir liste ile bile çalışacak mı? – luchosrock

+0

@luchosrock: Hayır, 'groupby' ardışık öğeleri –

12

Kullanayım bir collections.Counter:

from collections import Counter 
x = [1, 2, 2, 2, 3, 4, 5, 6, 6, 7] 
counts = Counter(x) 
output = [value for value, count in counts.items() if count > 1] 

İşte sırasını tutan başka versiyonu olduğu zaman Öğe, yalnızca dizinin geçirilen öğelerin yıkanabilir öğeler içerdiğini varsayar ve yinelenen öğeye set veya yeild eklendiğinde (ne zaman olduysa) tekrar çalışır.

def keep_dupes(iterable): 
    seen = set() 
    dupes = set() 
    for x in iterable: 
     if x in seen and x not in dupes: 
      yield x 
      dupes.add(x) 
     else: 
      seen.add(x) 

print list(keep_dupes([1,2,2,2,3,4,5,6,6,7])) 
+0

gruplandırır, ancak çıktıdaki öğelerin sırasını kaybedersiniz. –

+0

Yep. Bunun en iyi yolun olmadığı bir çok durum var. Ayrıca, girişin yıkanabilir olmasını gerektirir ... Ancak, O (n), iyi olmayan listeler için bile iyidir. – mgilson

+0

Offhand'i düşünebildiğim en kısa sipariş varyantı, [[k]> 1] sayılırsa OrderedDict.fromkeys (k) için k 'dir. – DSM

0

keepin' basit:

array2 = [] 
aux = 0 
aux2=0 
for i in x: 
    aux2 = i 
    if(aux2==aux): 
     array2.append(i) 
    aux= i 
list(set(array2)) 

çalışması gerekir

+0

Bu [2,2,6] 'yi vermeyecek mi? – DSM

+0

@DSM ahaha Haklısınız, cevabımı düzenledim, Teşekkürler :) – luchosrock