2013-04-04 2 views
7

So che questa è probabilmente una risposta facile ma non riesco a capirlo. Qual è il modo migliore in Python per mantenere i duplicati in un elenco:Mantieni i duplicati in un elenco in Python

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

L'output dovrebbe essere:

[2,6] 

ho trovato questo link: Find (and keep) duplicates of sublist in python, ma sono ancora relativamente nuovo per Python e non riesco a farlo funzionare per una semplice lista.

+0

Hai provato uno dei uno liners in quel post? –

+0

Hai bisogno di conservare l'ordine? – DSM

+0

@DSM - Sembra che stessimo pensando la stessa cosa ... – mgilson

risposta

8

Questo è un breve modo per farlo se l'elenco è ordinato già:

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

Funzionerà anche con python2.6, che è un problema con il mio. – mgilson

+0

funzionerà anche con una lista non ordinata? – luchosrock

+0

@luchosrock: No, 'groupby' raggruppa elementi consecutivi –

12

userei un 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] 

Ecco un'altra versione che mantiene l'ordine di quando il l'articolo è stato duplicato per la prima volta e presuppone solo che la sequenza passata contenga elementi lavabili e funzionerà quando set o yeild è stato introdotto nella lingua (ogni volta che lo era).

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

Tuttavia, si perde l'ordine degli elementi nell'output. –

+0

Sì. Ci sono molte situazioni in cui questo non è il modo migliore per andare. Richiede anche che l'input sia lavabile ... Ma è O (n) anche per gli elenchi non ordinati che è bello. – mgilson

+0

La variante più breve che io possa pensare a offhand è '[k per k in OrderedDict.fromkeys (x) if counts [k]> 1]'. – DSM

0

keepin' è semplice:

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

Che dovrebbe funzionare

+0

Questo non darà '[2,2,6]'? – DSM

+0

@DSM ahaha hai perfettamente ragione, ho modificato la mia risposta, grazie :) – luchosrock