2014-05-14 18 views
6

Próbuję zmodyfikować tę definicję, która wymienia zduplikowane elementy, tak aby wyświetlała indeksy duplikatów. Chciałbym też, aby lista wszystkich duplikatów oznaczała, że ​​wypadkowa dla a = [1,2,3,2,1,5,6,5,5,5] będzie duplicate_indexes = [3,4,7 , 8,9] Oto definicja:Wyświetlenie listy duplikatów wartości na liście za pomocą Pythona

def list_duplicates(seq): 
    seen = set() 
    seen_add = seen.add 
    # adds all elements it doesn't know yet to seen and all other to seen_twice 
    seen_twice = set(x for x in seq if x in seen or seen_add(x)) 
    # turn the set into a list (as requested) 
    return list(seen_twice) 

a = [1,2,3,2,1,5,6,5,5,5] 
list_duplicates(a) # yields [1, 2, 5] 

Odpowiedz

6
a, seen, result = [1, 2, 3, 2, 1, 5, 6, 5, 5, 5], set(), [] 
for idx, item in enumerate(a): 
    if item not in seen: 
     seen.add(item)   # First time seeing the element 
    else: 
     result.append(idx)  # Already seen, add the index to the result 
print result 
# [3, 4, 7, 8, 9] 

Edit: można po prostu użyć listowych w tej funkcji, jak to

def list_duplicates(seq): 
    seen = set() 
    seen_add = seen.add 
    return [idx for idx,item in enumerate(seq) if item in seen or seen_add(item)] 

print list_duplicates([1, 2, 3, 2, 1, 5, 6, 5, 5, 5]) 
# [3, 4, 7, 8, 9] 
+0

Używasz zestawu do '' 'seen''' zrobić test członkostwa szybki? – wwii

+0

@wwii Tak. Masz rację: – thefourtheye

0
def list_duplicates_index(seq): 
    return [i for (i,x) in enumerate(a) if x in list_duplicates(a)] 
4

listowych aby wydrukować indeks duplikatów. To plastry listę aż do wybranego indeksu i zwraca wartość indeksu, jeśli element jest już obecny w plastrach listy

a= [1, 2, 3, 2, 1, 5, 6, 5, 5, 5] 
result=[idx for idx, item in enumerate(a) if item in a[:idx]] 
print result #[3, 4, 7, 8, 9] 
+0

+1 za to, że jest ona najkrótsza i najłatwiej wyrażająca specyfikację w porównaniu z innymi odpowiedziami. –

0
def list_duplicates(seq): 
    d = {} 
    for i in seq: 
     if i in d: 
      d[i] += 1 
     else: 
      d[i] = 1 
    dups = [] 
    for i in d: 
     if d[i] > 1: 
      dups.append(i) 
    lst = [] 
    for i in dups: 
     l = [] 
     for index in range(len(seq)): 
      if seq[index] == i: 
       l.append(index) 
     lst.append(l[1:]) 
    new = [] 
    for i in lst: 
     for index in i: 
      new.append(index) 
    return new