我有一个字典清单。像这样的东西。
'authors': [
[
{
'name': 'ABC',
'ids': [
'144548847'
],
}
{
'text': 'ABC',
'fragments': [
]
}
],
[
{
'name': 'XYZ',
'ids': [
'145715698'
],
'slug': 'Xy-z'
},
{
'text': 'X.y.Z',
'fragments': [
]
}
]
]
我想提取所有作者的“姓名”(可能有两个以上的作者)。 这样我只能得到'ABC'。
for values in results:
"Author(s) :",values['authors'][0][0]['name']
这里的结果是主词典,该词典的值作为词典列表,我想从该词典中提取作者的名字。
我尝试执行以下操作,但这给了我 TypeError:列表索引必须是整数或切片,而不是str
for values in results:
"Author(s) :",values['authors'][0][0:]['name']
答案 0 :(得分:0)
这是对任意结构化的深度数据集使用递归进行操作的简单方法:
def traverse(x):
if isinstance(x, list):
for v in x:
traverse(v)
elif isinstance(x, dict):
if 'name' in x:
authors.append(x['name'])
else:
for v in x.values():
traverse(v)
>>> authors = []
>>> traverse(values['authors'])
>>> print(authors)
['ABC', 'XYZ']
为使其更好,更通用,可以将全局列表authors
更改为局部变量,然后将其创建然后在递归中传递。如果您需要该功能,我将把这项工作留给您。
编辑:仅使用列表理解:
>>> [y.get('name') for x in values['authors'] for y in x if y.get('name')]
['ABC', 'XYZ']
这不太干净,而且很难阅读,因此我会以这种方式小心处理。
答案 1 :(得分:0)
您尝试过
for values in results:
for each in values['authors']:
name = each.get("name")
if name:
print("Author(s) :", name)