15

Создание словаря с помощью генератора словарей

18

Заголовок: Можно ли использовать синтаксис генератора списков для создания словаря?

Тело вопроса:

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

Вот что у меня получилось:

d = {... for k, v in zip(keys, values)}

Однако это не работает. Есть ли возможность создать словарь с помощью такого синтаксиса, и если да, то как это правильно сделать?

5 ответ(ов)

0

На самом деле, вам даже не нужно итерироваться по объекту, если он уже представляет собой некое отображение. Конструктор 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), вы можете легко создать словарь без дополнительной обработки.

0

Вы ищете термин "генератор словарей" (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, чтобы отфильтровать данные перед отображением ключей и значений.

0

В 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.

0

Если вы используете 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, вы можете создавать словари с одинаковой логикой, но с разным синтаксисом.

0

В дополнение к ответу @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)}

Оба варианта создадут словарь, используя пары ключ-значение из соответствующих списков.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь