Python比对两个字典列表提取指定字段共有值的实现方法
问题背景
现有两组存储url信息的字典列表,注意原示例中两个列表均命名为ref会出现变量覆盖问题,先做区分命名:
- 第一组存储url与分类映射:
ref_category = [{"url":"https://example1.com","category":"sports"}, {"url":"https://example2.com","category":"movie"}, {"url":"https://example3.com","category":"sports"}, {"url":"https://example4.com","category":"sports"}]
- 第二组存储url与机构信息映射:
ref_org = [{"url":"https://example1.com","org":"sports"}, {"url":"https://example5.com","org":"movie"}, {"url":"https://example2.com","org":"sports"}, {"url":"https://examplex.com","org":"movie"}, {"url":"https://example3.com","org":"sports"}]
需求为提取两个列表中url字段值完全相同的条目,预期输出:
["https://example1.com","https://example2.com", "https://example3.com"]
原写法错误分析
之前使用的列表推导式[i for i in new["url"] if i in ref["url"]]无法得到正确结果,核心问题有三个:
- 两个列表同名
ref会被后赋值的列表覆盖,无法获取第一组列表数据 ref、new都是字典构成的列表,不是单个字典,直接用["url"]做索引会触发类型错误,Python列表不支持字符串键取值- 没有先遍历列表提取每个字典内的
url值,直接对列表做成员判断逻辑不成立
正确实现方案
高效集合交集写法(推荐,适合大数据量场景)
利用集合交集计算重复值,成员判断时间复杂度为O(1),执行效率最高:
# 分别提取两组列表的所有url值,转为集合 url_set_category = {item["url"] for item in ref_category} url_set_org = {item["url"] for item in ref_org} # 取交集后转为列表即为结果 common_urls = list(url_set_category & url_set_org)
保序列表推导式写法
如果需要保留url在第一组列表中的原有出现顺序,可以用如下写法:
# 先把第二组列表的url存为集合,加速成员判断 org_url_pool = {item["url"] for item in ref_org} common_urls = [item["url"] for item in ref_category if item["url"] in org_url_pool]
若列表中存在缺失
url键的字典,可以把item["url"]替换为item.get("url", ""),避免触发KeyError。
内容的提问来源于stack exchange,提问作者imhans4305
相关产品推荐
相关产品推荐

