#python #list-comprehension #dictionary-comprehension
#python #понимание списка #понимание словаря
Вопрос:
Допустим, у меня есть список словарей, которые выглядят следующим образом:
final_list = [{'city': 'value', 'population': 'value'}, {'city': 'value', 'population': 'value'}, {'city': 'value', 'population': 'value'}]
И у меня есть список списков, который выглядит следующим образом:
input_list = [['London', 'New York', 'San Francisco'], [8908081, 8398748, 883305]]
Я пытаюсь сопоставить правильные значения с input_list
to final_list
, но не могу понять, как это сделать. Я бы предположил, что это будет что-то вроде:
n = 0
while n < len(final_list):
for category in input_list:
for section in final_list:
# then here, somehow say
# for the nth item in each of the sections, update the value to nth item in category
# then increment n
Любая помощь будет высоко оценена! Заранее спасибо 🙂
Ответ №1:
Вот возможное решение:
final_list = [{'city': c, 'population': p} for c, p in zip(*input_list)]
Вот содержимое final_list
:
[{'city': 'London', 'population': 8908081},
{'city': 'New York', 'population': 8398748},
{'city': 'San Francisco', 'population': 883305}]
Вы можете сделать даже что-то более причудливое, используя только функциональный подход. Это работает с любым количеством ключей, которые вам могут понадобиться.
from itertools import cycle
keys = ('city', 'population')
final_list = list(map(dict, zip(cycle([keys]), zip(*input_list))))
Комментарии:
1. Вау, это был действительно чистый способ сделать это, спасибо!
2. Я бы выбрал
update
то, чтоfinal_list
было определено:[d.update({"city":c,"population":p}) for d,c,p in zip(final_list, *input_list)]
Ответ №2:
Решение Риккардо Букко будет работать, но если вы хотите, чтобы оно работало с любыми категориями (а не только с городом и населением), этот код сделает это:
final_list = [{'city': 'value', 'population': 'value'}, {'city': 'value', 'population': 'value'}, {'city': 'value', 'population': 'value'}]
input_list = [['London', 'New York', 'San Francisco'], [8908081, 8398748, 883305]]
for i in range(len(final_list)):
for k in range(len(list(final_list[i].keys()))):
final_list[i][list(final_list[i].keys())[k]] = input_list[k][i]
print(final_list)
Комментарии:
1. обратите внимание, что
zip
это также работает с несколькими списками (если вы предполагаетеzip
, что работает только с 2 списками)2. Я знаю, но тогда вам нужно будет вручную добавить категории сюда:
{'city': c, 'population': p}
3. Я как раз собирался задать последующий комментарий о том, как я мог бы сделать его более общим, этому сайту всегда удается прочитать мои мысли 🙂 Большое вам спасибо!
4. Хорошо, я понимаю, что вы имеете в виду. вы имеете в виду использование
keys()
вместо их жесткого кодирования5. Точно, я думаю, что в большинстве случаев лучшим решением является сделать ваш код более общим, на случай, если вы что-то измените…