2014-05-14 105 views
6

我试图修改此列表中重复项目的定义,以便列出重复值的索引。另外,我希望列出所有重复项,这意味着a = [1,2,3,2,1,5,6,5,5,5]的结果将为duplicate_indexes = [3,4,7 ,8,9]这里的定义是:使用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] 

回答

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] 

编辑:你可以只使用列表中理解该功能,这样

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

您正在使用一组'''seen'''使成员资格测试快速? – wwii

+0

@wwii是的。与其他答案相比,您是正确的 – thefourtheye

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

列表理解打印重复索引。它切片列表,直到选定的指数,如果该项目是已经存在于切片返回列表索引值

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,因为它既是最短也是最清楚地表达规范。 –

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