从Python的列表中删除两个重复的元素

时间:2018-08-08 06:45:47

标签: python python-3.x python-2.7

我有列表

输入:
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

2 个答案:

答案 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]]