2014-05-14 16 views
6

Sto tentando di modificare questa definizione che elenca gli elementi duplicati in modo che elenchi indici di valori duplicati. Inoltre, vorrei che elencasse TUTTI i duplicati, il che significa che risultante per a = [1,2,3,2,1,5,6,5,5,5] sarebbe duplicato_index = [3,4,7 , 8,9] Ecco la definizione:Elenca indici di valori duplicati in un elenco con Python

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] 

risposta

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: Si può solo utilizzare di lista in quella funzione, come questo

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

Si utilizza un set per '' 'seen''' per fare il test di appartenenza veloce? – wwii

+0

@wwii Sì. Sei corretto – thefourtheye

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

lista comprensione per stampare il indice dei duplicati. Affetta la lista fino alla indice selezionato e ritornare il valore dell'indice se l'articolo è già presente nella lista fette

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 per essere il più breve e il più chiaramente esplicativo della specifica, rispetto alle altre risposte. –

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 
Problemi correlati