首页 文章

Python并删除列表列表中的重复项,无论列表中的顺序如何

提问于
浏览
2

我搜索过并且没有找到与我相同的问题 . 我想从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]

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

2 回答

  • 7

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

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

    然后删除重复项

  • 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]]
    

    (这不是't optimized; ideally, you' d只调用 frozenset(x) 一次并将结果存储在变量中 . )

相关问题