首页 > 解决方案 > 在保留重复项的同时减去两个列表

问题描述

我有两个列表,我想从另一个列表中减去一个。

我见过有人使用集合,但我的列表包含重复项,所以我相信这不是我的选择。

int_list = [(1,1), (-1, 210), (-1, 210)]
new_list = [(-1, 210)]

final_list = [item for item in int_list if item not in new_list]

我得到final_list = [(1,1)]了,但我想(-1,210)在最终列表中保留第二个副本。我理解为什么会发生这种情况,但我不知道另一种减去列表的方法。我想我可以按原样返回最终列表,然后附加 int_list 中出现多次且也出现在 new_list 中的任何元素,但我觉得应该有更简单的方法。任何帮助表示赞赏

标签: pythonlist

解决方案


有一种 hack-ey 方法可以做到这一点,也可以保留顺序:

int_list = [(1,1), (-1, 210), (-1, 210)]
new_list = [(-1, 210)]

final_list = [item for item in int_list if item not in new_list or new_list.remove(item)]
# final_list == [(1, 1), (-1, 210)]

这确保我们不会从int_list. 如果也new_list包含重复项,它也应该工作。请注意,它会发生变异new_list,因此如果需要,请事先制作一份副本。


推荐阅读