Преобразование одного словаря в список словарей

#python #list #dictionary

Вопрос:

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

Например, следующий словарь:

 only_dict = {'First': [1, 2], 'Second': [3, 4]}  

Должен иметь следующий вывод, где значения больше не находятся в списке.

 out_lst = [{'First': 1, 'Second': 3}, {'First': 2, 'Second': 4}]  

Комментарии:

1. что ты пробовал

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

3. Что должно произойти для этого ввода {'First': [1, 2], 'Second': [3, 4, 5]} ? А этот: {'First': [1, 2], 'Second': [3, 4], 'Third': [5, 6]} ?

4. Списки значений всегда будут одинаковой длины.

5. Итак, второй вариант? {'First': [1, 2], 'Second': [3, 4], 'Third': [5, 6]}

Ответ №1:

 [{"First": v[0], "Second": v[1]} for v in only_dict.values()]  

Ответ №2:

Вот общая версия для списков любой длины:

 only_dict = {'First': [1,2,3], 'Second': [4,5,6], 'Third': [7,8,9]} [dict(zip(only_dict, val)) for val in only_dict.values()]  

выход:

 [{'First': 1, 'Second': 2, 'Third': 3},  {'First': 4, 'Second': 5, 'Third': 6},  {'First': 7, 'Second': 8, 'Third': 9}]  

Комментарии:

1. Разве ОП не пытается добиться противоположного? Что-то вроде: [dict(zip(only_dict, val)) for val in only_dict.values()]

2. @SayandipDutta, конечно, ты прав, большое спасибо, я думаю, мой мозг выдвинул свою собственную идею в промежутке между тем, как я прочитал вопрос и набрал ответ ^^ В любом случае, важной частью было показать zip здесь

Ответ №3:

Простая версия для списков любой длины. Во-первых, получите максимальную длину списка:

 count = max(*[len(x) for x in only_dict])  

Создайте каждый из словарей один за другим:

 out_lst = [{k: v[i] for k, v in only_dict.items() if len(v) gt;= i} for i in range(count)]  

Ответ №4:

Простой подход к заполнению списка на основе общей длины исходного словаря.

 only_dict = {'First': [1, 2], 'Second': [3, 4]} out_dict = {index: {} for index in range(len(only_dict.keys()))} def fill(key, values):  for index, val in enumerate(values):  out_dict[index][key] = val [fill(key, val) for key, val in only_dict.items()] out_dict = list(out_dict.values())  print(out_dict)  

Выводит вывод

 [{'First': 1, 'Second': 3}, {'First': 2, 'Second': 4}]