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