减去两个列表,同时保留重复项

时间:2019-07-31 18:40:17

标签: python list

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

我看到人们在使用集合,但是我的列表包含重复项,因此我认为这不是我的选择。

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中的任何元素,但我觉得应该有一种更简单的方法。  任何帮助表示赞赏

3 个答案:

答案 0 :(得分:2)

简单:

for x in new_list:
    if x in int_list: int_list.remove(x)

注意:remove会删除第一个匹配值

答案 1 :(得分:1)

有一种方法可以保留顺序:

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,因此如果需要,请事先进行复制。

答案 2 :(得分:0)

您可以为第一个列表创建Counter,然后用第二个Counter减去它。然后,您可以使用剩余计数重新创建列表:

from collections import Counter
from itertools import chain

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

final_list_counts = Counter(int_list) - Counter(new_list)
final_list = list(chain(*[[t] * count for t, count in final_list_counts.items()]))
print(final_list)  # [(1, 1), (-1, 210)]