with - python dictionary comprehension example




Crear un diccionario con la lista de comprensión en Python (7)

Crear un diccionario con la lista de comprensión en Python

Me gusta la sintaxis de comprensión de lista de Python.

¿Se puede usar para crear diccionarios también? Por ejemplo, al iterar sobre pares de claves y valores:

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

Asumiendo que blah blah blah es una iterable de dos tuplas, estás muy cerca. Vamos a crear algunos "blahs" así:

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

Sintaxis de la comprensión del dictado:

Ahora la sintaxis aquí es la parte de mapeo. Lo que hace que esto sea una comprensión de dict lugar de una comprensión de set (que es lo que se aproxima a su pseudocódigo) es el colon, como abajo:

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

Y ahora cuando lo hagas:

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

Añadiendo un filtro:

Al igual que las comprensiones de listas, puede agregar una parte de filtro al final:

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

Aquí probamos si el último carácter es divisible por 2.

Me gusta la sintaxis de comprensión de lista de Python.

¿Se puede usar para crear diccionarios también? Por ejemplo, al iterar sobre pares de claves y valores:

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

Aquí hay otro ejemplo de creación de diccionario usando la comprensión de dict:

Lo que debo hacer aquí es crear un diccionario alfabético donde cada par; es la letra inglesa y su posición correspondiente en el 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 el uso de enumerar aquí para obtener una lista de alfabetos y sus índices en la lista e intercambiar los alfabetos e índices para generar el par de valores clave para el diccionario

Espero que te dé una buena idea de compilación de diccionarios y te aliente a usarlo más a menudo para que tu código sea compacto.


En Python 2.6 y anteriores, el constructor dict puede recibir un iterable de pares clave / valor:

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

Desde Python 2.7 y 3 en adelante, puedes usar la sintaxis de comprensión de dict directamente:

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

Por supuesto, puede usar el iterable de la forma que desee (tuplas y listas de literales, comprensión de generadores, comprensión de listas, funciones de generador, composición funcional ... sentirse creativo) siempre que cada elemento sea un iterable de dos elementos:

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

En Python 2.7, va como:

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

Zip ellos !


Para agregar a la respuesta de @ fortran, si desea iterar sobre una lista de claves key_list así como una lista de valores value_list :

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

o

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

Prueba esto,

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

Supongamos que tenemos dos listas país y capital.

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

Luego crea el diccionario de las dos listas:

print get_dic_from_two_lists(country, capital)

La salida es así,

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

Para la versión de python <2.7, haga lo siguiente:

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

Para la versión de python> = 2.7, haga lo siguiente:

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




dict-comprehension