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