Python中从字典列表获取指定id项的最Pythonic方法
从id唯一的字典列表中取指定项的Pythonic实现
首先先纠正你原写法的两个问题:
- 语法错误:Python列表推导式里没有
where关键字,筛选条件需要用if声明 - 性能和健壮性问题:这个写法会遍历完整个列表生成一个临时列表,哪怕目标元素在列表第一位也会跑完所有循环,白白浪费算力和内存;如果目标id不存在,会直接抛出
IndexError,问题定位不清晰。
推荐写法
单次查询场景:生成器 + next()(最符合Python风格)
如果只需要从列表里查一次目标id,直接用下面的写法即可:
d_ = next(d for d in list_of_dicts if d['id'] == 'the_id_i_want')
这个写法的优势:
- 惰性迭代:找到第一个匹配项就立刻终止遍历,不会跑完整个列表,长列表下性能比列表推导好很多
- 无额外内存开销:不会生成临时列表,直接返回匹配到的字典对象
- 语义清晰:如果找不到匹配项会抛出
StopIteration,比原写法的IndexError更能体现“没找到目标”的问题;如果不想抛错,可以给next()传入默认值,比如找不到时返回None:
d_ = next((d for d in list_of_dicts if d['id'] == 'the_id_i_want'), None)
注意:指定默认值时,必须把生成器表达式用括号包裹,否则会触发语法错误。
多次查询场景:提前转换为id映射字典
如果你需要对这份API返回的列表做多次id匹配查询,不要每次都写循环遍历,拿到响应后一次性把列表转成id为键的字典,后续所有查询都是O(1)时间复杂度,一劳永逸:
# 拿到API返回的list_of_dicts后,仅做一次转换 id_map = {item['id']: item for item in list_of_dicts} # 后续查询直接按键取值即可 d_ = id_map['the_id_i_want'] # 避免KeyError可以用get方法,找不到时返回None或者自定义默认值 d_ = id_map.get('the_id_i_want')
因为你已经明确所有字典的id是唯一的,转字典的时候完全不用担心键冲突覆盖的问题。
选择建议
- 仅做单次查询、列表长度较小:直接用
next()搭配生成器的写法,简洁高效,是最地道的Python写法 - 需要多次查询:不管原始数据来自哪里,拿到后先转id映射字典,后续代码会简洁很多,性能也更好
- 不要用列表推导后取
[0]的写法,属于典型的可运行但非最优的实现,没有任何优势。
内容的提问来源于stack exchange,提问作者steadynappin
相关产品推荐
相关产品推荐

