我有列表
输入:
L = [[1, 2, 3], [2, 3, 4], [5, 6, 7], [2, 3, 4], [2, 3, 5], [1, 2, 3], [1, 2, 3]]
输出:
L= [[5, 6, 7], [ 2, 3, 5]]
我要检查是否L[i]== L[j]
,然后将L[j]
从列表中删除。
你能帮我吗?
这是我的代码:
for i in range(0,len(L) - 1):
for j in range(1,len(L) - 1):
if (L[i] == L[j]):
L.remove(L[j])
print(L)
但是它给出了一个错误:
if (L[i] == L[j]):
IndexError: list index out of range
答案 0 :(得分:3)
一旦删除了L
的元素,L
的形状就会改变。这就是为什么出现索引超出范围错误的原因:您仍在遍历L
的原始长度,但是一旦从L
中删除元素,它就会变得更短。
您可以通过使用count
创建一个新列表来解决此问题:
L2 = [sublist for sublist in L if L.count(sublist) == 1]
print(L2)
>>> [[5, 6, 7], [2, 3, 5]]
注意:即使您的当前逻辑适应了L
不断变化的长度,也不会返回您想要的输出。仍然会保留所有重复元素的第一个“副本”,如下面的Richard Rublev's answer所产生。
如果这太慢了(O(n 2 )),这是使用Counter
的O(n)解决方案:
from collections import Counter
# Converting elements to hashable type
L = [tuple(sublist) for sublist in L]
cnt = Counter(L)
# Grabbing non-duplicated items
L2 = [k for k, v in cnt.items() if v == 1]
# Converting elements back to lists
L2 = [list(sublist) for sublist in L2]
print(L2)
>>> [[5, 6, 7], [2, 3, 5]]
答案 1 :(得分:1)
尝试一下
testdata = [[1, 2, 3], [2, 3, 4], [5, 6, 7], [2, 3, 4], [2, 3, 5], [1, 2, 3], [1, 2, 3]]
unique = [list(x) for x in set(tuple(x) for x in testdata)]
结果
[[2, 3, 5], [2, 3, 4], [5, 6, 7], [1, 2, 3]]