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
个零(我认为这也是重要的细节)。
答案 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
库的一种解决方案。注意compose
和unique
配方是懒惰的,如果您无权访问该库,则很容易从相应的源代码中提取。
请注意,我们对每个子列表进行排序,然后转换为不可变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]]
答案 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)