Python 并删除列表列表中的重复项,而不管列表中的顺序如何

标签 python list duplicates

我已经搜索过,但没有找到与我相同的问题。我想从 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]

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

最佳答案

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) 并将结果存储在一个变量中。)

关于Python 并删除列表列表中的重复项,而不管列表中的顺序如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18623871/

相关文章:

python - 使用 Pyramid 返回 xlsxwriter 响应时的解码问题

python - Visual Studio Code 在 Python 终端中的代码之间添加行导致语法错误

python - 替换每行中小于 "n"最大项的 numpy 数组的所有值

python - 得到一系列列表的笛卡尔积?

bash - 使用 bash/awk 从 csv 中删除重复项

mysql - 删除除每个成员的最近两个条目之外的所有行

python - , 运算符用在条件语句的右侧时有何作用?

python - 打印由任何字符而不是逗号分隔的列表项 (Python)

javascript - 如何在 Javascript 中按设定顺序显示列表中随机选择的 3 个单词?

Python重命名重复项