Применение значений списка к списку словарей

#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. Точно, я думаю, что в большинстве случаев лучшим решением является сделать ваш код более общим, на случай, если вы что-то измените…