【问题标题】:Deleting duplicates from a list of lists if some duplicates do not have the same order [duplicate]如果某些重复项的顺序不同,则从列表列表中删除重复项[重复]
【发布时间】:2011-10-07 03:53:02
【问题描述】:

我的问题与下面链接的问题非常相似,只是如果有 [2,1] 元素,我也需要将其删除。

Removing duplicates from a list of lists

我尝试了各种各样的方法,但就是无法成功。任何帮助将非常感激!

谢谢。

【问题讨论】:

  • 您不能对所有子列表进行排序,然后应用您链接到的解决方案吗?
  • 哇!不知道为什么我没有想到。
  • 哦我记得为什么我没有想到它,我需要子列表保持有序!

标签: python list duplicates


【解决方案1】:

这可行,但它不保留子列表的顺序:

def bygroup(k):
    k = sorted(sorted(x) for x in k)
    return [k for k,_ in itertools.groupby(k)]

>>> k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [2, 1]]

>>> bygroup(k)
[[1, 2], [2, 5, 6], [3], [4]]

在 Python 2.7 或 3.2 中,如果您需要保留子列表中的顺序以及列表的一般顺序(重复项除外),则可以使用 OrderedDict,但速度要慢得多:

def bydict(k):
    s = collections.OrderedDict()
    for i in k:
        s[tuple(sorted(i))] = i
    return s.values()

>>> bydict(k)
[[2, 1], [4], [5, 6, 2], [3]]

我使用 timeit 进行了 100,000 次迭代测试。在 Python 2.7.2 中,bydict 函数耗时大约 4 倍,在 Python 3.2 中耗时大约 3 倍。

【讨论】:

  • 谢谢,但是我需要保留子列表的顺序。
  • 正如 Tim Pietzcker 目前建议的那样,我在创建每个子列表时对其进行排序,然后使用我链接到的问题中讨论的最快方法。你知道你的方法是否会比这更快吗? (当我有时间时,我可以自己检查)。
【解决方案2】:

也许你真正想要的是一个set of sets

unique = set(map(set, list_of_lists))

编辑:好吧,但这不起作用。唉,集合不能包含集合,因为集合是不可散列的。不过frozenset 是:

unique = set(map(frozenset, list_of_lists))

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 2014-09-30
    • 2017-12-15
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多