删除列表列表中存在的重复的重复列表,而不考虑整数列表的排序

时间:2018-05-22 12:28:57

标签: python python-3.x duplicates nested-lists

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]

对于我的情况 [1, 2, -1]被视为等于[2, 1, -1][1, -1, 2]相同。从本质上讲,排序无关紧要。

[1, 2, -1] = [2, 1, -1] = [1, -1, 2]

在上述情况下,我只需要保留其中的1个(这三个中的任何一个都可以)。

因此,删除重复项后,该列表现在必须为l1 = [[1, 2, -1], [1, 0, 1]]l1 = [[2, 1, -1], [1, 0, 1]]l1 = [[1, -1, 2], [1, 0, 1]]

我尝试对单个列表进行排序(但这会让我失去看到三元组的顺序)并将每个单独的列表放在字典中(TypeError: unhashable type: 'list'

注意:

当我说“不考虑整数列表的排序”时,我的意思是如果我的列表列表中有3个列表具有相同的整数,那么命令不同?这3个列表被认为是相同的!您可以从这3个列表中删除2个,但保留未删除列表的顺序,

我举例说明,对于我的列表l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]列表,[[-1, 1, 2], [0, 1, 1]]是不可接受的,因为[-1, 1, 2]实际上并不存在于原始数组中的确切序列中! [-1, 1, 2] = [1, 2, -1] = [2, 1, -1] = [1, -1, 2]是真的!如果我在我的列表中有这4个元素。但是,我的列表清单中没有[-1,1,2]!

同样重要:

我可能在整数列表列表中有重复的元素。

l1 = [[1, 0, 0], [0, 1, 0], [-1, 0, 1]]

此处:[1, 0, 0] = [0, 1, 0],在返回输出时,我需要将其中一个删除。

我想强调的是,这些个别列表中有2个零(我认为这也是重要的细节)。

3 个答案:

答案 0 :(得分:2)

您可以使用sorted对列表进行排序,然后检查并附加到结果。

<强>实施例

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
checkVal = []
r = []
for i in l1:
    val = sorted(i)
    if val not in checkVal:
        checkVal.append(val)
        r.append(i)
print(r)

<强>输出:

[[1, 2, -1], [1, 0, 1]]

答案 1 :(得分:1)

这是使用第三方toolz库的一种解决方案。注意composeunique配方是懒惰的,如果您无权访问该库,则很容易从相应的源代码中提取。

请注意,我们对每个子列表进行排序,然后转换为不可变tuple。这允许unique形成并跟踪O {1)查找的set值。

from toolz import unique, compose

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]

res = list(unique(l1, key=compose(tuple, sorted)))

print(res)

[[1, 2, -1], [1, 0, 1]]

源代码:toolz.composetoolz.unique

答案 2 :(得分:1)

您也可以在不使用任何第三方库的情况下实现相同的效果:

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
seen = set()

out = []
for l in l1:
    t = tuple(sorted(l))
    if t in seen:
        continue
    seen.add(t)
    out.append(l)

print(out)