从 Python 个列表中的列表中删除重复项目
Remove duplicate items from lists in Python lists
我想从 Python 的子列表中的列表中删除重复项。
例子:
- myList = [[1,2,3], [4,5,6,3], [7,8,9], [0,2,4]]
至
- myList = [[1,2,3], [4,5,6], [7,8,9], [0]]
我试过这个代码:
myList = [[1,2,3],[4,5,6,3],[7,8,9], [0,2,4]]
nbr = []
for x in myList:
for i in x:
if i not in nbr:
nbr.append(i)
else:
x.remove(i)
但是有些重复项没有删除。
像这样:[[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 4]]
我还有重复的数字4。
您遍历了您也在修改的列表:
...
for i in x:
...
x.remove(i)
这意味着它可能会在下一次迭代时跳过一个元素。
解决方案是创建列表的浅表副本并在修改原始列表的同时对其进行迭代:
...
for i in x.copy():
...
x.remove(i)
您可以通过以下方式加快速度:
- 使用
set
代替列表进行重复成员资格测试,并且
- 重建每个子列表,而不是在循环中重复调用
list.remove()
(每次 linear-time 操作)。
seen = set()
for i, sublist in enumerate(myList):
new_list = []
for x in sublist:
if x not in seen:
seen.add(x)
new_list.append(x)
myList[i] = new_list
>>> print(myList)
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [0]]
如果你想要适度的速度提升和适度的可读性损失,你也可以这样写:
seen = set()
for i, sublist in enumerate(myList):
myList[i] = [x for x in sublist if not (x in seen or seen.add(x))]
为什么你得到错误答案:在你的代码中,扫描前 3 个子列表后,nbr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
。现在x = [0, 2, 4]
。 i = x[1]
时检测到重复项,因此 x = [0, 4]
。现在 i
移动到 x[2]
停止 for 循环。
已在其他回答中提出优化。一般'list'只对取元素有好处,appending/removing在后面。
我想从 Python 的子列表中的列表中删除重复项。
例子:
- myList = [[1,2,3], [4,5,6,3], [7,8,9], [0,2,4]]
至
- myList = [[1,2,3], [4,5,6], [7,8,9], [0]]
我试过这个代码:
myList = [[1,2,3],[4,5,6,3],[7,8,9], [0,2,4]]
nbr = []
for x in myList:
for i in x:
if i not in nbr:
nbr.append(i)
else:
x.remove(i)
但是有些重复项没有删除。
像这样:[[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 4]]
我还有重复的数字4。
您遍历了您也在修改的列表:
...
for i in x:
...
x.remove(i)
这意味着它可能会在下一次迭代时跳过一个元素。
解决方案是创建列表的浅表副本并在修改原始列表的同时对其进行迭代:
...
for i in x.copy():
...
x.remove(i)
您可以通过以下方式加快速度:
- 使用
set
代替列表进行重复成员资格测试,并且 - 重建每个子列表,而不是在循环中重复调用
list.remove()
(每次 linear-time 操作)。
seen = set()
for i, sublist in enumerate(myList):
new_list = []
for x in sublist:
if x not in seen:
seen.add(x)
new_list.append(x)
myList[i] = new_list
>>> print(myList)
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [0]]
如果你想要适度的速度提升和适度的可读性损失,你也可以这样写:
seen = set()
for i, sublist in enumerate(myList):
myList[i] = [x for x in sublist if not (x in seen or seen.add(x))]
为什么你得到错误答案:在你的代码中,扫描前 3 个子列表后,nbr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
。现在x = [0, 2, 4]
。 i = x[1]
时检测到重复项,因此 x = [0, 4]
。现在 i
移动到 x[2]
停止 for 循环。
已在其他回答中提出优化。一般'list'只对取元素有好处,appending/removing在后面。