【问题标题】:Python and remove duplicates in list of lists regardless of order within listsPython并删除列表列表中的重复项,无论列表中的顺序如何
【发布时间】:2018-09-07 05:49:16
【问题描述】:

我已经搜索并没有完全找到与我相同的问题。我想从 python 列表中删除重复项;但是,我不在乎这些值在列表中的顺序。我目前这样做的方式太耗时了。

我想做什么:

A = [[1,2,3] , [2,3,4] , [3,4,5] , [3,2,4]]

我想搜索 A 并删除所有重复项。这里的重复项是 [2,3,4] 和 [3,2,4]。这将减少到:

smaller_A = [[1,2,3] , [2,3,4], [3,4,5]]

我现在是怎么做的:

todelete = []
for i in range(len(A)):
    for j in range(i+1,len(A)):
        if set(A[i]) == set(A[j]):
           todelete.append(j)

todelete = sorted(set(todelete))

smaller_A= [A[i] for i in range(len(A)) if i not in todelete]

同样,这很有效,但是当我的列表很大时,它非常耗时。有任何想法吗?谢谢!

【问题讨论】:

    标签: python list duplicates


    【解决方案1】:

    Frozensets 非常适合这种情况,当您需要嵌套集合时:

    >>> A = [[1,2,3], [2,3,4], [3,4,5], [3,2,4]]
    >>> smaller_A = {frozenset(x) for x in A}
    >>> smaller_A
    {frozenset({1, 2, 3}), frozenset({2, 3, 4}), frozenset({3, 4, 5})}
    

    要转换回列表,您可以这样做:

    >>> [list(x) for x in smaller_A]
    [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
    

    这不会保留列表的顺序或其中的元素。 (虽然在这里并没有什么不同。)

    如果您确实需要保留顺序,您可以遍历A,同时跟踪目前看到的frozensets:

    >>> A = [[1,2,3], [2,3,4], [3,4,5], [3,2,4]]
    >>> seen = set()
    >>> smaller_A = []
    >>> for x in A:
    ...     if frozenset(x) not in seen:
    ...         smaller_A.append(x)
    ...         seen.add(frozenset(x))
    ...
    >>> smaller_A
    [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
    

    (这没有优化;理想情况下,您只需调用一次frozenset(x) 并将结果存储在变量中。)

    【讨论】:

    • 这太棒了!我没有遇到frozenset。我确实需要保留某种顺序,所以我使用了您提供的小循环。但是,我不太明白什么没有优化。你是说在 if 语句之前我会有 fs = freezeset(x),然后在接下来的两行中使用 fs 吗?谢谢!
    • 为了好玩,这将我的代码(包含 5040 个列表的列表)从 24.1 秒加速到 0.0067 秒!哇!地震的道具!
    【解决方案2】:

    您可以通过这种方式进行排序

    for i in range(len(A)): A[i].sort()
    

    然后删除重复项

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      相关资源
      最近更新 更多