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

如何用Pythonic方式检查字典列表是否为另一字典列表的子集?

如何用Pythonic方法检查字典列表是否为另一个字典列表的子集?

核心问题

字典属于不可哈希类型,无法直接使用集合的issubset()方法,同时需要兼顾低内存、高执行效率(适配无服务器按次计费场景)。


解决方案

根据数据规模和资源限制,提供两种优化方案:

1. 轻量内存友好型(小数据量/内存受限)

直接利用all()结合生成器表达式,逐个检查子集元素是否存在于超集中。无需额外内存开销,但时间复杂度为O(m*n)(m为子集长度,n为超集长度),适合超集规模较小的场景。

def is_subset(subset_list, superset_list):
    return all(item in superset_list for item in subset_list)

2. 高效哈希优化型(大数据量/时间优先)

将超集的字典转换为可哈希的结构(如排序后的键值对元组,或固定键顺序的元组)存入集合,利用集合O(1)的查找特性将时间复杂度降至O(n+m),大幅提升大数据量下的执行速度——对于按次计费的无服务器环境,更快的执行时间意味着更低的费用。

通用版本(适配任意结构的字典)

通过排序键值对确保字典顺序不影响哈希结果:

def is_subset(subset_list, superset_list):
    superset_set = {tuple(sorted(d.items())) for d in superset_list}
    return all(tuple(sorted(d.items())) in superset_set for d in subset_list)
针对性优化版本(字典结构固定时)

如果字典的键是固定的(如示例中的Key和Value),直接按固定顺序提取键值生成元组,避免排序开销,进一步提升效率:

def is_subset(subset_list, superset_list):
    superset_set = {(d['Key'], d['Value']) for d in superset_list}
    return all((d['Key'], d['Value']) in superset_set for d in subset_list)

验证示例

使用你提供的测试数据验证:

maybe_subset = [
    {'Key': 'apple', 'Value': '1234'},
    {'Key': 'orange', 'Value': '2431'},
    {'Key': 'banana', 'Value': '9999'}
]

maybe_superset = [
    {'Key': 'orange', 'Value': '2431'},
    {'Key': 'banana', 'Value': '9999'},
    {'Key': 'creator', 'Value': 'JOHNSMITH'},
    {'Key': 'apple', 'Value': '1234'}
]

print(is_subset(maybe_subset, maybe_superset))  # 输出: True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:42:12