2013-04-04 16 views
7

Wiem, że to prawdopodobnie łatwa odpowiedź, ale nie mogę tego zrozumieć. Jaki jest najlepszy sposób w Pythonie, aby zachować duplikaty na liście:Zachowaj duplikaty na liście w Pythonie

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

Wyjście powinno być:

[2,6] 

znalazłem ten link: Find (and keep) duplicates of sublist in python, ale jestem nadal stosunkowo nowy w Pythonie i nie mogę go uruchomić na prostą listę.

+0

Czy próbowałeś jednego z jednej wkładki w tym poście? –

+0

Czy chcesz zachować porządek? – DSM

+0

@ DSM - Wygląda na to, że myśleliśmy o tym samym ... – mgilson

Odpowiedz

8

To jest krótki sposób to zrobić, jeśli lista jest posortowana już:

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

Będzie to również działać z python2.6, który jest problemem z moim. – mgilson

+0

czy to zadziała, nawet z nieuporządkowaną listą? – luchosrock

+0

@luchosrock: Nie, 'groupby' grupuje kolejne elementy –

12

bym użyć 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] 

Oto kolejna wersja, która utrzymuje porządek, gdy element został pierwszy zduplikowany, który zakłada, że ​​przekazywana sekwencja zawiera elementy nadające się do zagospodarowania i będzie działać po wprowadzeniu do języka set lub yeild (kiedykolwiek to było).

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

Jednak tracisz kolejność elementów na wyjściu. –

+0

Tak. Jest wiele sytuacji, w których nie jest to najlepsza droga. Wymaga to również wejścia, które można by zahaczyć ... Ale to O (n) nawet dla nie posortowanych list, co jest miłe. – mgilson

+0

Najkrótszym zamawianym wariantem, jaki mogę sobie wymyślić, jest '[k dla k w OrderedDict.fromkeys (x), jeśli liczy [k]> 1]'. – DSM

0

keepin' to prosta:

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

To powinno działać

+0

Czy to nie da "[2,2,6]"? – DSM

+0

@ ASM ahaha masz całkowitą rację, edytowałem swoją odpowiedź, dzięki :) – luchosrock

Powiązane problemy