python - 在python中通过字符串条件提取列表中的字典的一部分
问题描述
我有一个列表,其中包含以下格式的字典:
mydataset =
[{'thing1': 'pink',
'thing2': 'apple',
'thing3': 'car',
'data': [{'firstname': 'jenny',
'lastname': 'jones',
}]},
{'thing1': 'blue',
'thing2': 'banana',
'thing3': 'bicycle',
'data': [{'firstname': 'david',
'lastname': 'walls',
}]}]
我希望能够提取firstname
在“数据”中调用的所有项目,即'jenny'
和'david'
。
我尝试了一种方法myextract = [x in x if mydataset['data']]
,但当然它失败了,因为我认为我正在寻找一个价值。我对数据结构的心智模型目前不正确。
解决方案
使用以下列表推导:
res = [di["firstname"]for d in mydataset for di in d["data"] if "firstname" in di]
print(res)
输出
['jenny', 'david']
上面的列表推导等价于下面的 for 循环:
res = []
for d in mydataset:
for di in d["data"]:
if "firstname" in di:
res.append(di["firstname"])
print(res)
请注意,上述两种解决方案都适用于子字典中的多个元素,d["data"]
即使"firstname"
键不存在也是如此。
为了可重用性,您还可以定义一个函数,让您访问数据集中的各个值并将其用于此特定示例:
def nested_getitem(path, dic):
from operator import getitem
from functools import reduce
return reduce(getitem, path, dic)
res = [nested_getitem(["data", 0, "firstname"], d) for d in mydataset]
print(res)
输出
['jenny', 'david']
推荐阅读
- php - 本地主机上的php图像删除unlink()问题
- java - 我们如何使用单例模式存储 url 和时间戳?
- json - 通过python合并来自不同API的多个JSON响应
- javascript - JQuery - 更改和按键事件给出不同的结果
- asp.net-mvc - 如何在 AspNetUsersRoles 中添加额外的列?
- c# - 将 ASP.NET Core 诊断响应时间提取到语义日志记录数据库中
- sql-server - 从另一个数据库更新所有表模式
- bash - 从具有特定关键字的白线分隔的文件中删除一组行
- java - 使用 WebFlux 对特定映射的并行 GET 请求
- oracle - Oracle APEX for BI Publisher 报告中的键值对 XML 生成