#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}]