Вопрос-Ответ

Create a dictionary with comprehension

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

Могу ли я использовать синтаксис понимания списка для создания словаря?

Например, путем перебора пар ключей и значений:

d = {... for k, v in zip(keys, values)}
Переведено автоматически
Ответ 1

Используйте понимание dict (Python 2.7 и более поздние версии):

{key: value for key, value in zip(keys, values)}

В качестве альтернативы можно использовать dict конструктор:

pairs = [('a', 1), ('b', 2)]
dict(pairs) # → {'a': 1, 'b': 2}
dict((k, v + 10) for k, v in pairs) # → {'a': 11, 'b': 12}

Учитывая отдельные списки ключей и значений, используйте dict конструктор с zip:

keys = ['a', 'b']
values = [1, 2]
dict(zip(keys, values)) # → {'a': 1, 'b': 2}
Ответ 2

В Python 3 и Python 2.7+ понимание словаря выглядит следующим образом:

d = {k:v for k, v in iterable}

Для Python 2.6 или более ранней версии см. Ответ fortran.

Ответ 3

На самом деле, вам даже не нужно выполнять итерации по iterable, если он уже понимает какое-либо отображение, конструктор 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}
Ответ 4

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


Мне нравится синтаксис понимания списков в Python.


Можно ли использовать его и для создания словарей? Например, путем перебора пар ключей и значений:


mydict = {(k,v) for (k,v) in blah blah blah}

Вы ищете фразу "dict comprehension" - на самом деле это:

mydict = {k: v for k, v in iterable}

Предполагая, что blah blah blah является итерацией двух кортежей - вы очень близки к этому. Давайте создадим несколько подобных "бредней".:

blahs = [('blah0', 'blah'), ('blah3', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]

Синтаксис понимания Dict:

Теперь синтаксис здесь является частью сопоставления. Что делает это dict пониманием вместо set понимания (которое приблизительно соответствует вашему псевдокоду), так это двоеточие, : как показано ниже:

mydict = {k: v for k, v in blahs}

И мы видим, что это сработало, и должен сохраниться порядок вставки, как в Python 3.7:

>>> mydict
{'blah0': 'blah', 'blah3': 'blah', 'blah2': 'blah', 'blah3': 'blah'}

В Python 2 и до версии 3.6 порядок не был гарантирован:

>>> mydict
{'blah0': 'blah', 'blah3': '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 dictionary