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

Python 查找具有重复项的项的索引,python,list,Python,List,我有一个列表,其中有许多重复项,如何才能找到数组中所有重复项的索引。所以基本上我搜索一个数据项,如果它有重复项。它打印出项目所在位置的索引,包括重复项所在的位置。如果列表中的项目是可散列的,则可以将它们用作dict中的键: import collections somelist = list('ABRACADABRA') dups = collections.defaultdict(list) for index, item in enumerate(somelist): dups[i

我有一个列表,其中有许多重复项,如何才能找到数组中所有重复项的索引。所以基本上我搜索一个数据项,如果它有重复项。它打印出项目所在位置的索引,包括重复项所在的位置。如果列表中的项目是可散列的,则可以将它们用作dict中的键:

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]})
[('A', [3, 5, 7, 10]), ('B', [8]), ('R', [9])]

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

屈服

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

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

这将是最有效的方法,如果你真的很疯狂,你也可以保留一个
集,其中的键实际上是重复的,但是这可能不需要,在末尾遍历
dict
就足够了。@jamylak。集合将需要测试成员资格,如果找不到,在最坏的情况下需要O(n)遍历。如果实现为链表。@Dave我从未听说过需要O(n)成员身份的
集合
checks@Dave当然,这并不考虑散列冲突。我在这里说的是摊销时间,O(n)永远不会发生sets@jamylak,如果正在测试集合中成员资格的项目不存在,该怎么办。您可能已经遍历了整个链接列表来找到它。(如果将集合实现为链接列表)。我想我们讨论的是不同的底层数据结构。您没有打印找到的第一个副本的索引。两个
1s
@jamylak好的,现在检查一下。O(n)您应该发布所有代码,
temp
在this@jamylak好了,修好了。您可以删除-1。问题是哈希表需要用值初始化。
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