Из ввода JSON у меня есть список словарей, использующих одни и те же ключи:

[{'id': '1', 'country': 'Brazil'},
 {'id': '2', 'country': 'Spain'},
 {'id': '3', 'country': 'South Korea'},
 {'id': '4', 'country': 'United States'},
 {'id': '5', 'country': 'Italy'}]

Поскольку мне нужен простой способ получить значение id из любого имени country, я хочу преобразовать его в один словарь:

{'Brazil': 1, 'Spain': 2, 'South Korea': 3, 'United States': 4, 'Italy': 5}

Я думал, что смогу сделать это с пониманием словаря:

countries = {k:v for d in my_list for (k, v) in d.values()}

Тем не менее, это дает:

ValueError: too many values to unpack (expected 2)

Чего я не ожидал, поскольку d.values() должен возвращать только два элемента.

Что мне не хватает?

0
mrgou 14 Янв 2021 в 12:34

2 ответа

Лучший ответ

Как указано в комментариях, dict.items дает кортеж.

Однако простое изменение values на items перезапишет ваш только что сгенерированный словарь (и, более того, не приведет к желаемому результату).

>>> {k:v for item in my_list for (k,v) in item.items()}
{'id': '5', 'country': 'Italy'}

Вместо этого вы должны указать нужные вам ключи.

>>> {item['country']:item['id'] for item in my_list}
{'Brazil': '1', 'Spain': '2', 'South Korea': '3', 'United States': '4', 'Italy': '5'}
3
crissal 14 Янв 2021 в 09:41

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

my_list = [{'id': '1', 'country': 'Brazil'},
 {'id': '2', 'country': 'Spain'},
 {'id': '3', 'country': 'South Korea'},
 {'id': '4', 'country': 'United States'},
 {'id': '5', 'country': 'Italy'}]


countries = dict(tuple(d.values())[::-1] for d in my_list)
print(countries)

ВЫХОД

{'Brazil': '1', 'Spain': '2', 'South Korea': '3', 'United States': '4', 'Italy': '5'}
0
Chris Doyle 14 Янв 2021 в 09:59
65716477