Почему я получаю TypeError при создании dict ()? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть список диктов, из которых мне нужно извлечь, в новый список, некоторые элементы.Он отлично работает для одного элемента:

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 (и его значение).

Я подумал, что просто возьму значение, если b и update() оно с парой:

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

Это будетне работает (возвращает [None, None]), поскольку update() не возвращает результирующий дикт. предыдущий вопрос привел меня к созданию 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'

Что это значит?В частности: что такое «множественные значения», когда для этого ключа есть только одно (целое число)?

1 Ответ

0 голосов
/ 31 мая 2018

Вы передаете несколько 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}]
...