элемент - списки python




Создание словаря со списком в Python (7)

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

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

mydict = {(k,v) for (k,v) in blah blah blah}  # doesn't work

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

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

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

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

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

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

Синтаксис синтаксиса Дикта:

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

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

И теперь, когда вы это сделаете:

>>> 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.6 и ранее конструктор dict может принимать итерабельную пару ключей / значений:

d = dict((key, value) for (key, value) in iterable)

Начиная с Python 2.7 и 3, вы можете просто использовать синтаксис понимания dict :

d = {key: value for (key, value) in iterable}

Конечно, вы можете использовать итерируемый любым способом (кортежи и списки литералов, понимание генераторов, понимание списков, функции генератора, функциональный состав ... чувствуйте творческий), если каждый элемент является итерируемым из двух элементов:

d = {value: foo(value) for value in sequence if bar(value)}

def key_value_gen(k):
   yield chr(k+65)
   yield chr((k+13)%26+65)
d = dict(map(key_value_gen, range(26)))

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

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

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


Вот еще один пример создания словаря с использованием понимания dict:

То, что я делаю здесь, это создать словарь алфавита, где каждая пара; это английская буква и ее соответствующая позиция в английском алфавите

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>> 

Обратите внимание на использование перечисления здесь, чтобы получить список алфавитов и их индексов в списке и обменивать алфавиты и индексы для генерации пары значений ключа для словаря

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


Просто чтобы добавить другой пример. Представьте, что у вас есть следующий список:

nums = [4,2,2,1,3]

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

{index:nums[index] for index in range(0,len(nums))}

Фактически, вам даже не нужно перебирать итерируемый, если он уже понимает какое-то сопоставление, конструктор 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}

Для версии python <2.7 выполните следующие действия:

d = dict((i,True) for i in [1,2,3])

Для версии python> = 2.7 выполните следующие действия:

d = {i: True for i in [1,2,3]}






dict-comprehension