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

时间:2018-05-31 16:00:48

标签: python python-3.x dictionary list-comprehension

我有一个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}],这是提取的数据。

我现在意识到我还需要在提取的字典中包含原始字母中的另一个元素: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'

这是什么意思?具体来说:什么是&#34;多个值&#34;什么时候只有一个键(一个整数)?

1 个答案:

答案 0 :(得分: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}]