繁体   English   中英

使用列表推导操作嵌套在列表中的字典

[英]Operate on dicts nested inside a list using a list comprehension

我有一个字典列表,每个字典都有一个data键。 每个数据键都包含关于一个人的一堆属性,这些属性都不是必需的:

persons = [
    {"Name": "John", "data": {"Age": 23, "Gender": "Male"}},
    {"Name": "Jane", "data": {"Age": 22, "Gender": "Female"}},
    {"Name": "Harry", "data": {"Age": 22}},
    {"Name": "Hermione", "data": {"Gender": "Female"}},
]

我想做的是提取Age值的不同列表。 我这样做是这样的:

ages = set()
persondatas = [person['data'] for person in persons]
for persondata in persondatas:
    if 'Age' in persondata:
        ages.add(persondata['Age'])
ages

返回:

{22,23}

这正是我想要的,但我认为必须有一种比遍历使用列表理解获得的列表更好,更整洁的方法。 我可以在列表理解中完成所需的工作吗? 我第一次失败的尝试是这样的: [person['data']['Age'] for person in l]失败了:

KeyError:“年龄”

一定有更好的方法,但是我已经摆弄弄弄了,无法解决。 有人可以帮忙吗?

您可以在列表理解中添加一个条件-用一个循环删除这两个操作。

>>> {person['data']['Age'] for person in persons if 'Age' in person['data']}
set([22, 23])

请注意,我是如何使用花括号( {} )而不是方括号( [] )来表示集合的理解

尝试这个:

ages = set([person["data"]["Age"] for person in persons if "Age" in person["data"]])

一种解决方案是将列表理解与过滤器组合在一起。

set(filter(None, [p['data'].get('Age') for p in persons]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM