work Crie um dicionário com compreensão de lista em Python




work with dictionary in python (9)

Eu gosto da sintaxe de compreensão de lista do Python.

Pode ser usado para criar dicionários também? Por exemplo, iterando sobre pares de chaves e valores:

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

>>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}

Python suporta dict compreensões, que permitem expressar a criação de dicionários em tempo de execução usando uma sintaxe concisa similar.

Uma compreensão do dicionário assume o formato {chave: valor para (chave, valor) em iterável}. Esta sintaxe foi introduzida no Python 3 e backported até o Python 2.7, então você deve ser capaz de usá-la independentemente da versão do Python que você tenha instalado.

Um exemplo canônico é pegar duas listas e criar um dicionário onde o item em cada posição na primeira lista se torna uma chave e o item na posição correspondente na segunda lista se torna o valor.

A função zip usada dentro dessa compreensão retorna um iterador de tuplas, onde cada elemento na tupla é obtido da mesma posição em cada um dos iteráveis ​​de entrada. No exemplo acima, o iterador retornado contém as tuplas (“a”, 1), (“b”, 2) etc.

Saída:

{'i': 512, 'e': 64, 'o': 2744, 'h': 343, 'l': 1331, 's: 5832,' b ': 1,' w ': 10648,' c ': 8,' x ': 12167,' y ': 13824,' t ': 6859,' p ': 3375,' d ': 27,' j ': 729,' a ': 0,' z ' : 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216 , 'v': 9261}


Aqui está outro exemplo de criação de dicionário usando a compreensão de dit:

O que eu estou tentando fazer aqui é criar um dicionário de alfabeto onde cada par; é a letra inglesa e sua posição correspondente no alfabeto inglês

>>> 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}
>>> 

Observe o uso de enumerate aqui para obter uma lista de alfabetos e seus índices na lista e trocar os alfabetos e índices para gerar o par de valores-chave para o dicionário

Espero que ele ofereça uma boa idéia do dicionário para você e incentive você a usá-lo com mais frequência para tornar seu código compacto


Apenas para lançar outro exemplo. Imagine que você tenha a seguinte lista:

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

e você quer transformá-lo em um dict onde a chave é o índice e o valor é o elemento na lista. Você pode fazer isso com a seguinte linha de código:

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

Para a versão do python <2.7, faça o seguinte:

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

Para a versão python> = 2.7, faça o seguinte:

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

No Python 2.7, é como:

>>> list1, list2 = ['a', 'b', 'c'], [1,2,3]
>>> dict( zip( list1, list2))
{'a': 1, 'c': 3, 'b': 2}

Feche-os !


De fato, você não precisa nem iterar sobre o iterável se ele já compreende algum tipo de mapeamento, o construtor dict o faz graciosamente por você:

>>> 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}

Tente isso

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

Suponha que temos duas listas país e capital

country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

Em seguida, crie um dicionário nas duas listas:

print get_dic_from_two_lists(country, capital)

A saída é assim,

{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

Para adicionar à resposta de key_list , se você quiser iterar sobre uma lista de chaves key_list , bem como uma lista de valores value_list :

d = dict((key, value) for (key, value) in zip(key_list, value_list))

ou

d = {(key, value) for (key, value) in zip(key_list, value_list)}

Crie um dicionário com compreensão de lista em Python

Eu gosto da sintaxe de compreensão de lista do Python.

Pode ser usado para criar dicionários também? Por exemplo, iterando sobre pares de chaves e valores:

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

Assumindo blah blah blah é um iterável de duas tuplas - você está tão perto. Vamos criar alguns "blahs" assim:

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

Sintaxe de compreensão de ditado:

Agora a sintaxe aqui é a parte do mapeamento. O que torna isso uma compreensão de dict invés de uma compreensão de set (que é o que seu pseudo-código se aproxima) é o cólon, como abaixo:

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

E agora quando você faz:

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

Adicionando um filtro:

Assim como as compreensões de lista, você pode adicionar uma parte do filtro ao final:

>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}

Aqui testamos se o último caractere é divisível por 2.





dict-comprehension