如何根据字典列表正确过滤字典:排除重复name键
字典按键过滤:排除存在于列表字典name字段中的键
问题描述
给定一个字典dict1和一个包含多个字典的列表lst1,需要过滤dict1,移除所有键存在于lst1中任意字典的name字段值里的键值对。
示例输入
dict1 = {'code': 'varchar(25)', 'cnt': 'int', 'id': 'int'} lst1 = [{'name': 'client', 'datatype': 'varchar(100)'}, {'name': 'id', 'datatype': 'int'}, {'name': 'status', 'datatype': 'varchar(10)'}]
预期输出
dict2 = {'code': 'varchar(25)', 'cnt': 'int'}
解决方案
可以分两步高效实现:
- 提取
lst1中所有字典的name值,存入集合(集合的成员查询效率远高于列表) - 遍历原字典的键值对,筛选出键不在排除集合中的项,构建新字典
代码实现:
# 获取所有需要排除的键 exclude_keys = {item['name'] for item in lst1} # 过滤字典生成新结果 dict2 = {key: value for key, value in dict1.items() if key not in exclude_keys} print(dict2) # 输出: {'code': 'varchar(25)', 'cnt': 'int'}
代码说明
- 集合推导式
{item['name'] for item in lst1}能快速收集所有要排除的键,集合的in操作时间复杂度为O(1),数据量越大,比用列表查询的优势越明显。 - 字典推导式
{key: value ...}简洁地遍历原字典,只保留符合条件的键值对,代码可读性和执行效率都很高。
如果需要兼容Python 2.x,可改用生成器表达式实现:
exclude_keys = set(item['name'] for item in lst1) dict2 = dict((key, value) for key, value in dict1.items() if key not in exclude_keys)
内容的提问来源于stack exchange,提问作者seyev15735
相关产品推荐
相关产品推荐

