You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断一个列表包含另一个?含重复项忽略顺序的Python实现问询

如何判断一个列表是否包含另一个列表(含重复元素、忽略顺序)

好问题!在Python里,直接用内置的set(集合)来判断是行不通的——因为集合会自动去重,没法处理重复元素的数量要求。比如你例子里的l1 = [2,2,3]和l4 = [2,2,2],转成集合后都是{2,3}和{2},集合会认为l1是l4的超集,但实际上l1的2的数量不够,这显然不符合需求。

最优解决方案:用collections.Counter

Python标准库的collections.Counter专门用来统计可迭代对象中元素的出现次数,刚好能解决这个需要考虑重复元素的场景。

思路很简单:

  • 分别统计两个列表里每个元素的出现次数
  • 检查子集列表中的每一个元素,在超集列表中的计数都不少于它在子集里的计数
  • 如果所有元素都满足这个条件,就说明超集列表完全包含子集列表的内容

实现代码

from collections import Counter

def is_superset(larger_list, smaller_list):
    count_larger = Counter(larger_list)
    count_smaller = Counter(smaller_list)
    
    # 逐个检查子集元素的计数是否满足要求
    for item, required_count in count_smaller.items():
        if count_larger.get(item, 0) < required_count:
            return False
    return True

测试你的示例

把你给出的测试用例代入,结果完全符合预期:

l1 = [2, 2, 3]
l2 = [2, 2]
l3 = [3, 2]
l4 = [2, 2, 2]
l5 = [2, 5, 2]

print(is_superset(l1, l2))  # True
print(is_superset(l1, l3))  # True(顺序不影响,计数满足)
print(is_superset(l1, l4))  # False(l1只有2个2,不够3个)
print(is_superset(l1, l5))  # False(l1里没有元素5)

补充说明

这个实现就是非常Python风格的写法——利用标准库提供的工具,简洁、高效且可读性强。如果不想引入Counter,手动统计元素次数也能实现,但代码会繁琐很多,Counter无疑是最优选择。

内容的提问来源于stack exchange,提问作者Chuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:09:17