如何从列表列表中删除重复的无序元素?

时间:2017-06-20 22:19:47

标签: python list lambda

我有一份清单清单:

[[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]]

我试图删除元素[2,1,5]&amp;元素[7,1]&amp; [1,2,5]之后的[1,7] let priceFromFunction = ["<?php golemPrice();?>"]; 具有相同的元素,顺序并不重要。

删除此类元素的最快方法是什么?

3 个答案:

答案 0 :(得分:4)

您可以跟踪set中已见过的元素。您可以先对它们进行排序,以便正常化&#34;他们因而忽略了元素的顺序。

>>> lst = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]]
>>> seen = set()
>>> unique = []
>>> for x in lst:
...     srtd = tuple(sorted(x))
...     if srtd not in seen:
...         unique.append(x)
...         seen.add(srtd)
...         
>>> unique
[[1, 2, 5], [1, 7], [1, 6, 1], [2, 6]]

您必须先将已排序的元素转换为元组,然后再将它们放入集合中,因为列表不可清除。您也可以考虑使用frozenset,但这对于具有重复元素的条目(例如[1, 6, 1]

)不适用

答案 1 :(得分:0)

您可以这样做:

a = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]]
b = []
for k in a:
    if not sorted(k) in b:
        b.append(k)

>>> b
[[1, 2, 5], [1, 7], [1, 6, 1], [2, 6]]

Ps:如果您的输入列表中有重复项,请考虑在使用循环之前使用set()删除它们。

修改

如果订单无关紧要:

a = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]]
b = [[1, 2, 5], [7, 1], [1, 6, 1], [2, 6], [2, 1, 5], [1, 7]]

>>> list(map(list, set(tuple(sorted(k)) for k in a)))
[[2, 6], [1, 1, 6], [1, 2, 5], [1, 7]]

>>> list(map(list, set(tuple(sorted(k)) for k in b)))
[[2, 6], [1, 1, 6], [1, 2, 5], [1, 7]]

答案 2 :(得分:0)

您可以按如下方式创建集合列表:

my_list = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]]
new_list = [frozenset(element) for element in my_list]

要删除重复项,请执行以下操作:

cleaned_set = set(new_list)

cleaning_set是集合的集合,因此不包含重复项。