Создание словаря с помощью генератора словарей
Заголовок: Можно ли использовать синтаксис генератора списков для создания словаря?
Тело вопроса:
Я хочу создать словарь, используя синтаксис генератора списков. Например, я собираюсь итерироваться по парам ключей и значений.
Вот что у меня получилось:
d = {... for k, v in zip(keys, values)}
Однако это не работает. Есть ли возможность создать словарь с помощью такого синтаксиса, и если да, то как это правильно сделать?
5 ответ(ов)
На самом деле, вам даже не нужно итерироваться по объекту, если он уже представляет собой некое отображение. Конструктор dict
сам элегантно обрабатывает это для вас:
>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}
Таким образом, просто передав последовательность пар ключ-значение (как в списке ts
или коэффициенте gen
), вы можете легко создать словарь без дополнительной обработки.
Вы ищете термин "генератор словарей" (dict comprehension) - вот правильный синтаксис:
mydict = {k: v for k, v in iterable}
Предполагая, что blah blah blah
- это итерируемый объект, состоящий из пар кортежей (двухкортежей) - вы уже близки к тому, чтобы сделать это правильно. Давайте создадим некоторые "бла-бла":
blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]
Синтаксис генератора словаря:
Теперь синтаксис здесь включает в себя часть отображения. То, что делает это генератором словаря, а не генератором множества (к чему приблизился ваш псевдокод), это двоеточие :
, как показано ниже:
mydict = {k: v for k, v in blahs}
Мы видим, что это сработало, и порядок вставки будет сохраняться начиная с Python 3.7:
>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}
В Python 2 и до 3.6 порядок не гарантировался:
>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}
Добавление фильтра:
Все генераторы содержат компонент отображения и компонент фильтрации, которые вы можете предоставить с помощью произвольных выражений.
Вы можете добавить часть фильтра в конец:
>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}
Здесь мы просто проверяем, делится ли последний символ на 2, чтобы отфильтровать данные перед отображением ключей и значений.
В Python 2.7 можно использовать функцию zip
для объединения двух списков в словарь. Вот как это делается:
list1, list2 = ['a', 'b', 'c'], [1, 2, 3]
result = dict(zip(list1, list2))
print(result)
Результат будет таким:
{'a': 1, 'b': 2, 'c': 3}
Важно отметить, что порядок элементов в итоговом словаре будет соответствовать порядку элементов в исходных списках. Таким образом, если первый список содержит значения, которые вы хотите использовать в качестве ключей, а второй список содержит соответствующие значения, вы можете легко создать словарь, используя zip
и dict
.
Если вы используете Python версии 2.7 или выше, вы можете создать словарь с помощью генератора словарей, как показано ниже:
d = {i: True for i in [1, 2, 3]}
Если же ваша версия Python ниже 2.7, используйте функцию dict()
с генератором кортежей:
d = dict((i, True) for i in [1, 2, 3])
Таким образом, в зависимости от версии Python, вы можете создавать словари с одинаковой логикой, но с разным синтаксисом.
В дополнение к ответу @fortran, если вы хотите итерироваться по списку ключей key_list
и списку значений value_list
, вы можете использовать следующие способы для создания словаря:
d = dict((key, value) for (key, value) in zip(key_list, value_list))
или
d = {key: value for (key, value) in zip(key_list, value_list)}
Оба варианта создадут словарь, используя пары ключ-значение из соответствующих списков.
Итерация по словарям с использованием циклов 'for'
Создание словаря (dict) из отдельных списков ключей и значений
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Получить ключ по значению в словаре