Python:如何删除列表列表中的重复无序的子列表和单调的子列表

时间:2018-08-02 00:50:36

标签: python list set

我在这里看到了一些非常相关的问题,但是它们的答案对我不起作用。我有一个列表列表,其中1)重复了一些子列表,但它们的元素可能无序; 2)和一些子列表包含单调元素,但长度不同。例如

g = [[1, 2, 3], [3, 2, 1], [1, 1], [1, 1, 1], [1, 3, 2], [9, 0, 1], [4, 3, 2]]

根据我的问题,输出应该自然是:

g = [[1, 2, 3], [1, 1], [1, 1, 1], [9, 0, 1], [4, 3, 2]]

我尝试过set。它适用于重复无序的子列表,但将具有不同长度的单调元素的子列表视为相同。

4 个答案:

答案 0 :(得分:1)

使用已排序的元组作为哈希:

>>> g = [[1, 2, 3], [3, 2, 1], [1, 1], [1, 1, 1], [1, 3, 2], [9, 0, 1], [4, 3, 2]]
>>> result = []
>>> seen = set()
>>> for x in g:
...     hsh = tuple(sorted(x))
...     if hsh not in seen:
...         result.append(x)
...         seen.add(hsh)
...
>>> result
[[1, 2, 3], [1, 1], [1, 1, 1], [9, 0, 1], [4, 3, 2]]

如果您的子列表很小,这应该足够快,并且至少逻辑是明确的。

答案 1 :(得分:1)

set中使用tuples +排序的set comprehension

>>> g = {tuple(sorted(x)) for x in g}
{(0, 1, 9), (1, 1), (1, 1, 1), (1, 2, 3), (2, 3, 4)}

如果您真的需要列表列表作为输出,只需通过列表理解进行转换

>>> g_list = [list(x) for x in g]
[[0, 1, 9], [1, 2, 3], [2, 3, 4], [1, 1, 1], [1, 1]]

答案 2 :(得分:0)

如果顺序无关紧要,则可以尝试以下操作:

list(map(list,(set(map(lambda x: tuple(sorted(x)),g)))))

答案 3 :(得分:0)

列表理解+拆包:

print([*{*[tuple(sorted(i)) for i in g]}])

输出:

[(0, 1, 9), (1, 2, 3), (2, 3, 4), (1, 1, 1), (1, 1)]

如果您希望元素成为列表,请执行以下操作:

print([list(i) for i in {*[tuple(sorted(i)) for i in g]}])  

输出:

[[0, 1, 9], [1, 2, 3], [2, 3, 4], [1, 1, 1], [1, 1]]