2

a给定一个长度数组N,它是一个整数列表,我想提取重复值,其中我有一个包含重复位置的每个值的单独列表。在伪数学中:

If |M| > 1:
  val -> M = { i | a[i] == val }

示例 ( N=11):

a = [0, 3, 1, 6, 8, 1, 3, 3, 2, 10, 10]

应该给出以下列表:

3  -> [1, 6, 7]
1  -> [2, 5]
10 -> [9, 10]

我添加了python标签,因为我目前正在使用该语言进行编程(numpy 和 scipy 可用),但我对如何做到这一点的一般算法更感兴趣。不过,代码示例很好。

一个想法,我还没有充实:构造一个元组列表,将每个条目a与其索引配对:(i, a[i])。以第二个条目为键对列表进行排序,然后检查第二个条目相同的连续条目。

4

3 回答 3

4

这是一个使用python字典的实现(实际上是一个defaultdict,为了方便)

a = [0, 3, 1, 6, 8, 1, 3, 3, 2, 10, 10]
from collections import defaultdict
d = defaultdict(list)

for k, item in enumerate(a):
    d[item].append(k)
finalD = {key : value for key, value in d.items() if len(value) > 1}  # Filter dict for items that only occurred once.

print(finalD)    
# {1: [2, 5], 10: [9, 10], 3: [1, 6, 7]}
于 2013-08-20T15:45:29.120 回答
3

这个想法是创建一个字典,将值映射到它出现的位置列表。

这可以通过简单的方式完成setdefault。这也可以使用defaultdict.

>>> a = [0, 3, 1, 6, 8, 1, 3, 3, 2, 10, 10]
>>> dup={}
>>> for i,x in enumerate(a):
...     dup.setdefault(x,[]).append(i)
...
>>> dup
{0: [0], 1: [2, 5], 2: [8], 3: [1, 6, 7], 6: [3], 8: [4], 10: [9, 10]}

然后,可以使用集合理解来提取实际的重复项,以过滤掉只出现一次的元素。

>>> {i:x for i,x in dup.iteritems() if len(x)>1}
{1: [2, 5], 10: [9, 10], 3: [1, 6, 7]}
于 2013-08-20T15:50:15.247 回答
1

填充一个字典,其键是整数的值,其值是这些键的位置列表。然后浏览该字典并删除所有只有一个位置的键/值对。您将留下那些重复的。

于 2013-08-20T15:45:07.943 回答