Skip to main content
 首页 » 编程设计

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

2025年05月04日16jyk

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

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(及其值)。

我想如果 b 和 update() 成对的话我会取值:

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

这将不起作用(返回 [None, None]),因为 update() 不会返回结果字典。 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' 

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

请您参考如下方法:

您将多个 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}]