Python帮助从列表中提取值

1 投票
3 回答
634 浏览
提问于 2025-04-16 22:56
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"的字典。

有没有更符合Python风格的方法来做到这一点呢?

提前谢谢你!

3 个回答

1

如果没有找到的话,这里有一个小小的改进建议:

d16 = ([d for d in lst if d.get('id', 0) == 16] + [None])[0]
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会变成一个空列表。

4

这里是对已有答案的一些补充,目的是让评论区的讨论更清晰:

当你只需要从一系列数据中找到第一个符合条件的元素时,可以考虑使用生成器表达式:

d16 = (d for d in lst if d.get('id') == 16).next()

这个写法在我的代码中经常出现。如果在lst中没有符合条件的项,这会引发一个StopIteration的错误。当你预期会出现这种情况时,你可以选择捕获这个错误:

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循环遍历完所有输入后才会执行,如果是因为使用了break而提前结束循环,则会跳过这个部分)

撰写回答