2013-04-04 31 views
7

Ich weiß, das ist wahrscheinlich eine einfache Antwort, aber ich kann es nicht herausfinden. Was ist der beste Weg in Python die Duplikate in einer Liste zu halten:Duplikate in einer Liste in Python behalten

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

Die Ausgabe sollte:

[2,6] 

ich diesen Link gefunden: Find (and keep) duplicates of sublist in python, aber ich bin noch relativ neu in Python und ich kann es nicht für eine einfache Liste arbeiten.

+0

Haben Sie versucht, eine der Einzeiler in diesem Beitrag? –

+0

Müssen Sie die Ordnung bewahren? – DSM

+0

@DSM - Sieht so aus, als hätten wir das Gleiche gedacht ... – mgilson

Antwort

8

Dieses eine kurze Weg ist, es zu tun, wenn die Liste bereits sortiert ist:

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

Dies funktioniert auch mit python2.6, was ein Problem mit mir ist. – mgilson

+0

funktioniert das auch mit einer ungeordneten Liste? – luchosrock

+0

@luchosrock: Nein, 'groupby' Gruppen aufeinanderfolgende Elemente –

12

Ich würde eine Verwendung 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] 

Hier ist eine andere Version, die die Reihenfolge der, wenn hält die Artikel wurde zuerst dupliziert, die nur annimmt, dass die Sequenz, die übergeben wird, ausspülbare Elemente enthält, und es funktioniert, wenn set oder yeild in der Sprache eingeführt wurde (wann immer das war).

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

Sie verlieren jedoch die Reihenfolge der Elemente in der Ausgabe. –

+0

Ja. Es gibt viele Situationen, in denen dies nicht der beste Weg ist. Es erfordert auch, dass die Eingabe hashable sein muss ... Aber es ist O (n) selbst für unsortierte Listen, was schön ist. – mgilson

+0

Die kürzeste geordnete Variante, die ich mir vorstellen kann, ist '[k für k in OrderedDict.fromkeys (x) wenn counts [k]> 1]'. – DSM

0

Keepin' it simple:

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

, die funktionieren sollte

+0

Wird das nicht '[2,2,6]' geben? – DSM

+0

@DSM Ahaha du bist völlig richtig, ich habe meine Antwort bearbeitet, Danke :) – luchosrock

Verwandte Themen