3

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

4

3 回答 3

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])]
于 2013-04-03T12:40:12.623 回答
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
于 2013-04-04T16:46:06.130 回答
-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
于 2013-04-03T12:54:37.033 回答