【问题标题】:Get unique elements from list of lists when the order of the sublists does not matter当子列表的顺序无关紧要时,从列表列表中获取唯一元素
【发布时间】:2018-11-19 00:59:14
【问题描述】:

我有一个对列表,表示图中集群的所有边。实际上这个列表比这个更大。这只是一个例子。

[[1, 2], [2, 1], [3, 5], [6, 3], [3, 6]]

[1, 2] 表示节点 1 和 2 之间的一条边,[2, 1] 也是如此。 所以,我很难消除重复的对来计算集群的入度。

输出应该类似于[[1, 2], [3, 5], [3, 6]][[2, 1], [3, 5], [6, 3]]

【问题讨论】:

    标签: python list loops iterator


    【解决方案1】:

    要在保留顺序的同时删除重复项,您可以关闭字典:

    >>> data = [1, 2], [2, 1], [3, 5], [6, 3], [3, 6]
    >>> list({frozenset(edge): edge for edge in data}.values())
    [[2, 1], [3, 5], [3, 6]]
    

    整体保留顺序,以及每对中的顺序。如果出现欺骗,最后看到的一对将是保留结果的一对。您可以通过反向迭代保留第一对:

    >>> list({frozenset(edge): edge for edge in reversed(data)}.values())[::-1]
    [[1, 2], [3, 5], [6, 3]]
    

    如果您有旧版本的 Python (OrderedDict 执行相同操作:

    >>> from collections import OrderedDict
    >>> list(OrderedDict((frozenset(edge), edge) for edge in data).values())
    [[2, 1], [3, 5], [3, 6]]
    

    【讨论】:

    • 我对这个解决方案唯一关心的是,既然我们在这里讨论的是一个图表,我们遇到一个自循环并不是不可能的,在这种情况下它会失败。
    • @OlivierMelançon。好决定。或许frozenset 不是最好的排序机制。
    • 已更新以处理图表中自循环的情况。
    • 不直观,python 对我来说是一种新语言。我在学习。谢谢你,先生实际上它是一个无自环的无向加权图
    • 可以注意到,简单地反转data 会使第一对被保留......
    【解决方案2】:

    如果对元素的顺序无关紧要,则使用sorted 对对进行归一化。然后,使用set 消除重复项。

    lst = [1, 2], [2, 1], [3, 5], [6, 3], [3, 6]
    
    unique_pairs = {tuple(sorted(p)) for p in lst} # {(1, 2), (3, 6), (3, 5)}
    

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2017-04-12
      • 2012-04-04
      • 1970-01-01
      • 2020-04-30
      • 2016-05-26
      相关资源
      最近更新 更多