【问题标题】:Remove any duplicates in a list of lists when order doesn't matter (eg. [1,2,3] and [1,3,2] are duplicate sets)?当顺序无关紧要时删除列表列表中的任何重复项(例如,[1,2,3] 和 [1,3,2] 是重复集)?
【发布时间】:2020-09-21 15:02:18
【问题描述】:

我无意中删除了所有匹配项。我想保留至少一组事件。

例如,我有[[1,2,3],[1,3,2],[4,5,6],[5,6,4]],所需的输出类似于[[1,2,3],[4,5,6]]

s = 1,2,3,4,5,6
c = [[1,2,3],[4,5,6],[4,6,5]]

remove_sets = []
for a in range(0, len(c)):
    for b in permutations(c[a], 3):
        # my idea is that if list(b) != c[a]
        # it should not delete all occurences.
        if list(b) != c[a]:
            if list(b) in c:
                remove_sets.append(list(b))

# delete those occurences.
for cc in range(0, len(remove_sets)):
    if remove_sets[cc] in c:
        del c[c.index(remove_sets[cc])]

意外结果/输出

[[1,2,3]]

我想要的输出是

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

问题

有没有一个功能可以去除这些重复的顺序切换的集合?

【问题讨论】:

标签: python duplicates set


【解决方案1】:

groupby 如果您的重复子列表已经相邻并且您需要将它们压缩成单个单元,则可以使用:

>>> from itertools import groupby
>>> [next(v) for _, v in groupby(c, sorted)]
[[1, 2, 3], [4, 5, 6]]

在分组时调用sorted会忽略顺序,因此我们可以从每个组中略读第一项来获得您的结果。

否则,对于一般情况,使用类似的字典理解

>>> list({tuple(sorted(x)): x for x in c}.values())
[(1, 2, 3), (4, 6, 5)]

有效,但它只选择c 中的最后一个项目。如果你反向迭代c,你会得到第一个看到的:

>>> list({tuple(sorted(x)): x for x in c[::-1]}.values())[::-1]
[(1, 2, 3), (4, 5, 6)]

注意sortedO(n(log(n))),导致整体复杂度为

longest_len = max(map(len, c))
O(n * longest_len * log(longest_len))

如果您需要扩展到大型内部列表,请考虑使用collections.Counter 而不是sorted

【讨论】:

  • Groupby 有效,但效果不佳。您应该提到输入 c 需要已经排序到连续的组中,以便 groupby 在这里正常工作。
  • 是的,这很好。我没有仔细考虑这个问题。
  • 已更新...欺骗目标是最好的,但我很惊讶他们的浏览量如此之少。
猜你喜欢
  • 2020-01-20
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2019-04-01
  • 1970-01-01
  • 2021-02-16
相关资源
最近更新 更多