我有两个列表,我想从另一个列表中减去一个。
我看到人们在使用集合,但是我的列表包含重复项,因此我认为这不是我的选择。
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中的任何元素,但我觉得应该有一种更简单的方法。
任何帮助表示赞赏
答案 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)]