lst = [{"id": 1, "name": "ernest"}, .... {"id": 16, name:"gellner"}]
for d in lst:
if "id" in d and d["id"] == 16:
return d
我想从列表中提取密钥“id”等于“16”的字典。
这有更多的pythonic方式吗?
提前致谢
答案 0 :(得分:4)
对现有答案进行评论,以便退出评论:
当您只需要序列中的第一个匹配元素时,请考虑使用生成器表达式:
d16 = (d for d in lst if d.get('id') == 16).next()
这是您经常在我的代码中看到的模式。如果StopIteration
中没有与条件匹配的项目,则会引发lst
。当预计会发生这种情况时,您可以捕获异常:
try:
d16 = (d for d in lst if d.get('id') == 16).next()
except StopIteration:
d16 = None
或者更好的是,只需将整个内容展开到停止的for循环中
for d16 in lst:
if d16.get('id') == 16:
break
else:
d16 = None
(else:
子句仅在for循环耗尽其输入时才会运行,但如果for循环因为使用了break
而结束时会被跳过)
答案 1 :(得分:2)
这样做。它是否“更干净”是个人电话。
d16 = [d for d in lst if d.get('id', 0) == 16][0]
如果没有id为0的字典,则此初始方法将失败。您可以克服这种情况:
d16 = [d for d in lst if d.get('id', 0) == 16]
if d16: d16 = d16[0]
这将防止索引错误,但如果容器中没有符合条件的字典,则d16将为空列表。
答案 2 :(得分:1)
如果找不到,会有一点改善:
d16 = ([d for d in lst if d.get('id', 0) == 16] + [None])[0]