Python

2014-05-14 18 views
6

ile bir listedeki yinelenen değerlerin dizinlerini listeleme Yinelenen öğelerin dizinlerini listeleyecek şekilde yinelenen öğeleri listeleyen bu tanımı değiştirmeye çalışıyorum. Ayrıca, bir kopyasının tümünün listelenmesini istiyorum. A = [1,2,3,2,1,5,6,5,5,5] = duplicate_indexes = [3,4,7Python

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] 

cevap

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] 

Düzenleme::, 8,9 İşte tanım budur] sadece yazdırmak için bu

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

Sen üyelik testini yapmak için '' 'seen''' için kümesini kullanıyor hızlı? – wwii

+0

@wwii Evet. Diğer cevaplarla karşılaştırıldığında, en kısa ve en net şekilde belirtimi ifade etmek için – thefourtheye

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

Liste anlama gibi bu işlevde liste anlama kullanabilirsiniz çiftlerin indeksi. Seçilen endeks kadar listeyi dilimler ve öğe zaten dilimlenmiş listede varsa indeks değeri döndürmek

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 doğru. –

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