Pregunta Crear un diccionario con comprensión de listas en Python


Me gusta la sintaxis de comprensión de la 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

1025
2017-11-17 10:07


origen


Respuestas:


En Python 2.6 y versiones 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 el sintaxis de comprensión dict directamente:

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

Por supuesto, puede usar iterable de la forma que desee (tuplas y listas de literales, comprensión de generadores, listas de comprensión, funciones de generador, composición funcional ... sentirse creativo) siempre que cada elemento sea iterable en sí mismo 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)))

1573
2017-11-17 10:09



En Python 3 y Python 2.7+, las comprensiones del diccionario son las siguientes:

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

Para Python 2.6 o anterior, vea La respuesta de Fortran.


188
2017-11-17 10:22



De hecho, ni siquiera necesita iterar sobre el iterable si ya comprende algún tipo de mapeo, el constructor dict lo hace con gracia para usted:

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

38
2018-05-31 17:48



En Python 2.7, dice así:

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

Zip ellos!


28
2017-10-08 02:59



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

13
2018-01-15 00:23



Crear un diccionario con comprensión de listas en Python

Me gusta la sintaxis de comprensión de la 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 blah blah blah es un iterable de dos tuplas, estás muy cerca. Vamos a crear algunos "blahs" como ese:

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

Dict comprensión sintaxis:

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

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

Y ahora cuando lo haces:

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

Agregar un filtro:

Al igual que las listas de comprensión, puede agregar una parte del 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 personaje es divisible por 2.


10
2018-01-03 21:57



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

9
2018-06-26 09:05



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

Lo que estoy tratando de hacer aquí es crear un diccionario alfabético donde cada par; es la letra inglesa y su posición correspondiente en 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 le dé una buena idea de compilación de diccionario y lo alienta a usarlo más a menudo para que su código sea compacto.


6
2017-10-25 03:40