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

2024-04-25 23:54:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份字典清单。像这样的

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

这里的结果是主字典,它的值是字典列表,我想从字典中提取作者的名字

我试着做了下面的操作,但是它给了我类型错误:列表索引必须是整数或片,而不是str

for values in results:
        "Author(s) :",values['authors'][0][0:]['name']

Tags: textnameinids列表for字典作者
2条回答

下面是一个简单的方法,可以对任意结构的深层数据集使用递归:

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

这是不太干净,很难阅读,但,所以我会小心接近它这样做

你试过了吗

for values in results:
    for each in values['authors']:
        name = each.get("name")
        if name:
           print("Author(s) :", name)

相关问题 更多 >