也许这只是精神疲惫,但我不能为我的生活弄明白这一点,即使我在我创建的另一个程序中使用相同的原则..
我有两个清单:
compare_list = [0,1,1,2,3,3,4,7,5,8,9,9]
master_list = [0,1,2,3,4,8,9]
正如您所看到的,两个列表都包含一些相同的数字,而在compare_list中,您的值具有重复的值。
我想要完成的是比较两个列表,如果在master_list中找到它,则从compare_list中删除。
这是我到目前为止的代码:
for x in compare_list:
for y in master_list:
if x == y:
compare_list.remove(x)
结果是我确实从compare_list中删除了一些项目,但我仍然留下了一些副本..
输出:
print(compare_list)
[1,3,7,5,9]
如何从master_list删除所有重复项实例。所以compare_list只包含在master_list中找不到的数字?
答案 0 :(得分:1)
似乎是filter
>>> compare_list = [0,1,1,2,3,3,4,7,5,8,9,9]
>>> master_list = [0,1,2,3,4,8,9]
>>> filter(lambda i: i not in master_list, compare_list)
[7, 5]
答案 1 :(得分:0)
compare_list = [x for x in compare_list if x not in master_list]
如果master_list
包含多个项目,则使用set
master_set = set(master_list)
compare_list = [x for x in compare_list if x not in master_set]
答案 2 :(得分:0)
正如python官方文档 list.remove 所建议的那样 “从列表中删除值为x的第一个项目。如果没有这样的项目,则会出错。”
因此,如果您的 compare_list 中有重复项,则不会将其删除。
如果您已经有一个列表,并且需要从中删除重复项,我认为您需要在列表中转换列表:
compare_list = [1,2,2,3,4,5,5,5]
my_set = set(compare_list)
如果您需要过滤 compare_list 删除某些特定元素,则可以在使用set的方法删除将列表转换为集合后执行此步骤
答案 3 :(得分:0)
为什么不使用collections.Counter
:
import collections
compare_list = [0,1,1,2,3,3,4,7,5,8,9,9]
master_list = [0,1,2,3,4,8,9]
comp_set = collections.Counter(compare_list)
master_set = collections.Counter(master_list)
print comp_set-master_set
产:
Counter({1: 1, 3: 1, 9: 1, 5: 1, 7: 1})
请注意substract()
可能导致0
或负数。因此,要有效地使用您的结果,您可能需要添加额外的传递:
print [k for k,v in (comp_set-master_set).items() if v > 0]
# ^^^^^^^^
产:
[1, 3, 9, 5, 7]