【问题标题】:Extract values from lists of dictionaries; With same keys, but different values for each list从字典列表中提取值;使用相同的键,但每个列表的值不同
【发布时间】:2019-12-17 18:52:14
【问题描述】:

我有一个字典列表。像这样。

'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: list indices must be integers or slices, not str

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

【问题讨论】:

  • 使用[0] 而不是[0:]
  • 使用 [0] 只会给我作者的名字,但我想提取多个作者姓名。

标签: python dictionary


【解决方案1】:

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

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

然而,这不太干净而且很难阅读,所以我会小心地以这种方式接近它。

【讨论】:

  • 结果正是我想要的。谢谢!有没有办法做到这一点而不必定义一个函数。说切片操作?还是列出操作?
  • 是的,您可能有一种方法可以将它与列表或字典理解一起破解,但是如果您的架构发生变化,我不希望它是干净的或通用的。我已将其添加为我的答案的编辑:)
【解决方案2】:

你试过了吗

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

【讨论】:

  • 我得到 AttributeError: 'list' object has no attribute 'get'
  • 请改进一下您的示例(以正确的方式格式化),以便我们可以更好地帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多