Создать в Python словарь из двух списков разной длины
Список ключей:
fieldnames = ['name', 'Inf_0', 'Inf_1', 'Inf_2', 'Inf_3', 'Inf_4', 'Inf_5',]
Список значений в исходных данных может быть разной длины. Может быть короче списка ключей.
Если создавать словарь с помощью zip и укороченного списка значений, то размер словаря получается укороченным по длине списка значений.
Есть ли простой способ создавать такой словарь, не укорачивая его по списку значений, а заполняя недостающие значения пустыми строками, таким образом, чтобы размер словаря был равен размеру списка ключей?
Ответы (3 шт):
Всё придумано до нас. Используйте zip_longest из библиотеки itertools:
from itertools import zip_longest
fieldnames = ['name', 'Inf_0', 'Inf_1', 'Inf_2', 'Inf_3', 'Inf_4', 'Inf_5',]
values = [1, 2, 3]
print(dict(zip_longest(fieldnames, values, fillvalue='')))
Вывод:
{'name': 1, 'Inf_0': 2, 'Inf_1': 3, 'Inf_2': '', 'Inf_3': '', 'Inf_4': '', 'Inf_5': ''}
Без дополнительных модулей в два прохода, сначала создаем словарь через zip, потом пересоздаем с добавлением отсутствующих ключей:
d = dict(zip(fieldnames, values))
d = {key: d.get(key, '') for key in fieldnames}
Если не обязательно хранить все ключи, а нужно только чтобы при неизвестном ключе возвращалось пустое значение, можно использовать defalutdict:
from collections import defaultdict
fieldnames = ['name', 'Inf_0', 'Inf_1', 'Inf_2', 'Inf_3', 'Inf_4', 'Inf_5',]
values = ['abc', 'cde', 'efg']
d = defaultdict(lambda: 'default_value', zip(fieldnames, values))
print(d) # defaultdict(<function <lambda> at 0x7fb0985461f0>, {'name': 'abc', 'Inf_0': 'cde', 'Inf_1': 'efg'})
print(d['Inf_5']) # default_value
Можно сделать словарь из ключей и объединить его с zip
Данные:
fieldnames = ['name', 'Inf_0', 'Inf_1', 'Inf_2', 'Inf_3', 'Inf_4', 'Inf_5']
values = ['abc', '123', '456', '789']
Вариант 1 (python 3.9):
d = dict.fromkeys(fieldnames) | dict(zip(fieldnames, values))
print(d)
# {'name': 'abc', 'Inf_0': '123', 'Inf_1': '456', 'Inf_2': '789', 'Inf_3': None, 'Inf_4': None, 'Inf_5': None}
Вариант 2:
d = dict.fromkeys(fieldnames)
d.update(zip(fieldnames, values)) # Тоже самое, что d.update(dict(zip(fieldnames, values)))
print(d)