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及其值).
我以为我会只是采取值,如果b和update()它有一对:
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)
那是什么意思?具体来说:当该键只有一个(整数)时,"多个值"是什么?
您正在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'
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)