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

WoJ*_*WoJ 1 python dictionary list-comprehension python-3.x

我有一个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)
Run Code Online (Sandbox Code Playgroud)

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

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

我以为我会只是采取值,如果bupdate()它有一对:

y = [k["b"].update({"a": k["a"]}) for k in d]
print(y)
Run Code Online (Sandbox Code Playgroud)

这将不起作用(返回[None, None]),因为update()不返回结果的dict.一个先前的问题导致我建立一个dict()从组件:

x = [dict(a=k["a"], **k["b"]) for k in d]
print(x)
Run Code Online (Sandbox Code Playgroud)

这与崩溃

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'
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 6

您正在adict()呼叫传递多个密钥; 一个作为关键字参数,另一个作为**扩展映射:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

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

你可能正在使用你所要求的相同词典.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}]
Run Code Online (Sandbox Code Playgroud)