【问题标题】:Data structure to represent multiple equivalent keys in set in Python?在Python中表示多个等效键的数据结构?
【发布时间】:2015-10-13 11:42:19
【问题描述】:

目前,我想找到满足以下要求的正确数据结构。

有多个元素无序的数组,例如,

[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]

处理完这些数据,结果是,

[1, 2], [2, 2, 3], [2], [1, 2, 3]

对每个数组中的元素进行排序并过滤重复数组。

以下是我的想法:

  • 数据结构Set(Arrays)? - 失败的。内置set中好像只有一个数组@

    set([])

  • 数据结构Array(Sets)? - 失败的。但是,内置set 中没有重复元素。 我想知道Python中C++中是否存在multiset这样的数据结构?

【问题讨论】:

  • 顺便说一句,那些看起来像普通的 Python 列表,而不是 Python arrayss;流行的 3rd-party 包 Numpy 也提供了array 类型。
  • map(list,set(tuple(sorted(i)) for i in a)), 如果 a 是输入
  • @Vineesh:请不要将答案放入 cmets。
  • 回答你的问题:我认为list 你的多重集合...
  • A collections.Counter 是 python 的多重集。甚至在documentation 中也提到过。

标签: python data-structures set


【解决方案1】:

将您的列表转换为元组(因此可以是一个集合),然后返回列表。

>>> [list(i) for i in set([tuple(sorted(i)) for i in a])]
[[1, 2], [2], [2, 2, 3], [1, 2, 3]]

【讨论】:

    【解决方案2】:
    lst = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]
    map(list, set(map(tuple, map(sorted, lst)))
    

    输出:

    [[1, 2], [2], [2, 2, 3], [1, 2, 3]]
    

    【讨论】:

    • 我不知道,现在的孩子们,还有他们花哨的 schmancy 函数式编程。 :)
    • 哈哈!我知道 Guido 会强烈反对 :-)
    • 不知道,我认为您需要更多map 电话:-P。
    【解决方案3】:

    试试这个:

    [list(i) for i in set(map(tuple, a))]
    

    编辑: 假设 list 已经排序。感谢@PM2RING 提醒我。 如果没有,则在上面添加这一行

    a = [sorted(i) for i in a]
    

    再次感谢@PM2RING:一个班轮

    [list(i) for i in set(map(tuple, (sorted(i) for i in a)))]
    

    Demo

    【讨论】:

      【解决方案4】:

      目前这里的一些解决方案正在破坏排序。我不确定这对您是否重要,但这里有一个保留原始顺序的版本:

      >>> from collections import OrderedDict
      >>> A = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]
      >>> [list(k) for k in OrderedDict.fromkeys(tuple(sorted(a)) for a in A)]
      [[1, 2], [2, 2, 3], [2], [1, 2, 3]]
      

      【讨论】:

        【解决方案5】:

        没有 Python,没有内置的多重集;标准模块中最接近的等价物是collections.Counter,它是一种字典。计数器可能适合您的需求,但如果没有更多上下文就很难判断。


        请注意,集合保留添加顺序。如果您需要保留列表的初始顺序,您可以这样做:

        data = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]
        
        a = set()
        outlist = []
        for s in data:
            t = tuple(sorted(s))
            if t not in a:
                a.add(t)
                outlist.append(list(t))
        
        print(outlist)
        

        输出

        [[1, 2], [2, 2, 3], [2], [1, 2, 3]]
        

        如果输入列表的数量相当少,则不需要集合(以及列表元组转换),只需在outlist 中测试成员资格。但是,这对于较大的输入列表效率不高,因为它在列表上执行线性搜索。

        【讨论】:

        • 在没有线性搜索的情况下检查我的答案以获得更有效的重复数据删除
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 2018-10-25
        • 2017-02-18
        相关资源
        最近更新 更多