Python如何从含重复元素的原列表中移除子集列表得到剩余部分
问题场景
a、b都是允许存在重复元素的数字列表,且b是a的子集,示例:
a = [1, 1, 1, 2, 2, 3] b = [1, 1, 2]
需要实现函数删除a中和b匹配的元素(按出现次数扣减,比如b里有2个1就从a里删掉2个1,不是把所有1都删掉),预期运行效果:
>>> func(a, b) [1, 2, 3]
已知手动遍历枚举可以实现该需求,有没有更简便的实现方式?
实现方案
不需要写复杂的嵌套遍历,借助标准库collections.Counter做元素计数就能很简洁地实现,推荐保留原列表顺序的写法:
from collections import Counter def func(a, b): b_count = Counter(b) result = [] for item in a: if b_count[item] > 0: b_count[item] -= 1 else: result.append(item) return result
如果不要求输出结果和原a的元素顺序一致,还可以写得更短,直接用Counter的差集运算:
from collections import Counter def func(a, b): # 注意:该方法返回结果不保留原列表元素顺序 return list((Counter(a) - Counter(b)).elements())
两种写法都能正确处理带重复元素的场景,不会出现把同类元素全删光的问题。
内容的提问来源于stack exchange,提问作者sty331
相关产品推荐
相关产品推荐

