从字典列表中提取值;使用相同的键,但每个列表的值不同

时间:2019-12-17 18:52:14

标签: python dictionary

我有一个字典清单。像这样的东西。

'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']

2 个答案:

答案 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)