查找具有重复项的项目索引

时间:2013-04-03 12:38:20

标签: python list

我有一个包含许多重复项的列表,如何找到数组中所有重复项的索引。所以基本上我搜索一个数据项,如果它有重复。它打印出找到项目的索引,包括重复项的位置

3 个答案:

答案 0 :(得分:3)

如果列表中的项目是可清除的,您可以将它们用作词典中的键:

import collections

somelist = list('ABRACADABRA')
dups = collections.defaultdict(list)
for index, item in enumerate(somelist):
    dups[item].append(index)
print(dups)

产量

defaultdict(<type 'list'>, {'A': [0, 3, 5, 7, 10], 'R': [2, 9], 'B': [1, 8], 'C': [4], 'D': [6]})

如果项目不可清除(例如列表),那么下一个最佳解决方案是定义key函数(如果可能),该函数将每个项目映射到唯一的可哈希对象(例如元组) :

def key(item):
    return something_hashable
for index, item in enumerate(somelist):
    dups[key(item)].append(index)

如果找不到这样的key,则必须将看到的项目存储在列表中,并通过测试与所见对象列表中的每个项目的相等性来测试重复项目。这是O(n ** 2)。

# Don't use this unless somelist contains unhashable items
import collections
somelist = list('ABRACADABRA')
seen = []
dups = collections.defaultdict(list)
for i, item in enumerate(somelist):
    for j, orig in enumerate(seen):
        if item == orig:
            dups[j].append(i)
            break
    else:
        seen.append(item)
print([(seen[key], val) for key, val in dups.iteritems()])

产量

[('A', [3, 5, 7, 10]), ('B', [8]), ('R', [9])]

答案 1 :(得分:0)

试试这个:

def get_duplicate_indexes(li):
    retval = {}
    for i, x in enumerate(li):
        if x not in retval:
            retval[x] = []
        retval[x].append(i)
    return retval

答案 2 :(得分:-1)

>>> temp = {}
>>> def print_dupes(a):
...     for i,j in enumerate(a):
...             temp[j] = 0
...     for i,j in enumerate(a):
...             temp[j] += 1
...     for i,j in enumerate(a):
...             if temp[j] > 1:
...                     print i
...
>>> print_dupes([1,1,1,2,2,2,3,3])
0
1
2
3
4
5
6
7
>>> print_dupes([1,1,1,2,2,2,3])
0
1
2
3
4
5
>>> print_dupes([1,1,1,2,3])
0
1
2