【问题标题】:Extract list of duplicate values and locations from array从数组中提取重复值和位置列表
【发布时间】:2013-08-22 18:01:11
【问题描述】:

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

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])。以第二个条目为键对列表进行排序,然后检查第二个条目相同的连续条目。

【问题讨论】:

  • @SlaterTyranus:不。再次阅读问题,我需要重复列表及其位置
  • 这就像从那个问题改变了 12 个字符。足够接近,您应该能够从那里弄清楚。

标签: python algorithm sorting duplicates


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是一个使用 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]}
    

    【讨论】:

    • 最后一行应该是一个字典理解
    • @SlaterTyranus 好主意。出于某种原因,我从不记得存在字典推导式。
    【解决方案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]}
    

    【讨论】:

    • 我接受你的回答,因为集合理解似乎是更简洁的解决方案。
    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2012-10-07
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多