Список в словарь в Python: создание словарей на основе списков

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

Соединить два списка в словарь можно простым перебором в цикле for, используя при этом индексы:

en = ['one', 'two', 'three', 'four']
ru = ['один', 'два', 'три', 'четыре']
d = {}

for i in range(len(en)):
    d[en[i]] = ru[i]

print(d)

Результат:

{'one': 'один', 'two': 'два', 'three': 'три', 'four': 'четыре'}

Другой вариант - "упаковать" два списка встроенной в Python функцией zip(). В результате получается объект, который генерирует кортежи, состоящие из элементов первого и второго списка, находящихся в одинаковых позициях:

for e, r in zip(en, ru):
    d[e] = r

Для сокращения записи можно использовать словарное выражение:

d = {e : r for e, r in zip(en, ru)}

Когда есть только один список, и он используется в качестве ключей или значений, мы должны что-то сопоставлять либо ключам, либо значениям, чтобы получить парные записи словаря.

Если ключи берутся из списка, а все их исходные значения одинаковы (предполагается, что будут меняться потом), то проще всего воспользоваться методом fromkeys(). Это метод класса dict (от него в Python создаются экземпляры словарей).

pets = ['cat', 'dog', 'bird']
pets = dict.fromkeys(pets)
print(pets)

Результат:

{'cat': None, 'dog': None, 'bird': None}

Если значение None не подходит, то можно указать любое другое, передав его вторым аргументом во fromkeys().

pets = ['cat', 'dog', 'bird']
pets = dict.fromkeys(pets, 0)
print(pets)

adopt = input('Kind: ')
pets[adopt] = pets[adopt] + 1
print(pets)

Пример выполнения:

{'cat': 0, 'dog': 0, 'bird': 0}
Kind: dog
{'cat': 0, 'dog': 1, 'bird': 0}

Сложнее обстоит дело, когда список надо включить в словарь в качестве значений. Поскольку в одном словаре все ключи должны быть разными (уникальными), нет возможности использовать какое-либо одно "значение по-умолчанию" в качестве ключей.

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

pets = dict.fromkeys(['cat', 'dog', 'bird'])

house_143 = [20, 15, 4]

for pet, qty in zip(pets, house_143):
    pets[pet] = qty

print(pets)

Результат:

{'cat': 20, 'dog': 15, 'bird': 4}

Если словаря нет, то по условию задачи должно быть понятно, что следует использовать в качестве ключей. Допустим, это будут индексы элементов списка.

nums = ['one', 'two', 'three']

# d = {i+1 : nums[i] for i in range(len(nums))}
d = {}
for i in range(len(nums)):
    d[i+1] = nums[i]

print(d)  # {1: 'one', 2: 'two', 3: 'three'}

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


Решение задач на Python




Все разделы сайта