为什么在构建dict()时会出现TypeError?

问题描述 投票:1回答:1

我有一个dicts列表,我需要从中提取一些新元素。它适用于一个元素:

d = [
    {
        "a": 1,
        "b": {
            "x": 3
        },
        "blah": 4
    },
    {
        "a": 10,
        "b": {
            "x": 30
        },
        "blah": 40
    },
]

z = [k["b"] for k in d]
print(z)

这输出[{'x': 3}, {'x': 30}],它是提取的数据。

我现在意识到我还需要在提取的dict中包含原始的另一个元素:a(及其值)。

我认为如果bupdate()它与一对,我会采取的价值:

y = [k["b"].update({"a": k["a"]}) for k in d]
print(y)

这将无效(返回[None, None]),因为update()不会返回结果的dict。一个previous question让我从组件中构建了一个dict()

x = [dict(a=k["a"], **k["b"]) for k in d]
print(x)

这与崩溃

Traceback (most recent call last):
  File "C:/dev/config/scratches/scratch_21.py", line 24, in <module>
    x = [dict(a=k["a"], **k["b"]) for k in d]
  File "C:/dev/config/scratches/scratch_21.py", line 24, in <listcomp>
    x = [dict(a=k["a"], **k["b"]) for k in d]
TypeError: type object got multiple values for keyword argument 'a'

那是什么意思?具体来说:当该键只有一个(整数)时,“多个值”是什么?

python python-3.x dictionary list-comprehension
1个回答
6
投票

你传递了多个a键到dict()电话;一个作为关键字参数,另一个在**扩展映射中:

>>> dict(a=41, **{'a': 82})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type object got multiple values for keyword argument 'a'

在这里调用什么对象并不重要,关键字参数在任何调用中都必须是唯一的。

你可能正在使用你称为.update()的相同词典,所以现在你所有的k['b']词典都有一个a键。重新构建您的d列表,您的代码将起作用:

>>> [k["b"] for k in d]
[{'x': 3}, {'x': 30}]
>>> [dict(a=k["a"], **k["b"]) for k in d]
[{'a': 1, 'x': 3}, {'a': 10, 'x': 30}]
© www.soinside.com 2019 - 2024. All rights reserved.