enumerate () para diccionario en python

82

Sé que usamos enumeratepara iterar una lista, pero lo probé en un diccionario y no dio ningún error.

CÓDIGO:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}

for i, j in enumerate(enumm):
    print(i, j)

SALIDA:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

¿Alguien puede explicar el resultado?

Aditya Krishn
fuente
2
for i, j in enumerate(enumm) se iincrementa en cada iteración y jcaptura el elemento habitual del enumerateargumento de la función, que en este caso es un diccionario. Iterar sobre dictados es esencialmente iterar sobre sus claves.
Divyanshu Srivastava

Respuestas:

111

Además de las respuestas ya proporcionadas, hay un patrón muy agradable en Python que le permite enumerar tanto las claves como los valores de un diccionario.

El caso normal enumeras las claves del diccionario:

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}

for i, k in enumerate(example_dict):
    print(i, k)

Qué salidas:

0 1
1 2
2 3
3 4

Pero si desea enumerar tanto las claves como los valores, esta es la forma:

for i, (k, v) in enumerate(example_dict.items()):
    print(i, k, v)

Qué salidas:

0 1 a
1 2 b
2 3 c
3 4 d
João Almeida
fuente
1
(+1) También puede usar dictionary.items()(sin enumerar) para obtener un objeto de vista con pares clave-valor como una lista de tuplas.
Tiago Martins Peres 李大仁
62

La primera columna de salida es el índice de cada elemento enummy la segunda son sus claves. Si desea iterar su diccionario, use .items ():

for k, v in enumm.items():
    print(k, v)

Y la salida debería verse así:

0 1
1 2
2 3
4 4 
5 5
6 6
7 7

fuente
32

Solo pensé en agregar, si desea enumerar el índice, la clave y los valores de un diccionario, su bucle for debería verse así:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)
Jordan Mackie
fuente
3
Esta pregunta está relacionada con problemas de sintaxis, y esta respuesta proporcionó la solución más corta de dos paréntesis agregados:idx, (k, v) in enumerate(d.items()):
Sean Pianka
Hola Sean, no estoy seguro de si estás de acuerdo con la respuesta o simplemente dices que los nombres de variables más cortos dan una mejor respuesta.
Jordan Mackie
25
dict1={'a':1, 'b':'banana'}

Para enumerar el diccionario en Python 2.x:

for k,v in dict1.iteritems():
        print k,v 

En Python 3.x use:

for k,v in dict1.items():
        print(k,v)
# a 1
# b banana

Finalmente, como otros han indicado, si desea un índice en ejecución, también puede tenerlo:

for i  in enumerate(dict1.items()):
   print(i)  

 # (0, ('a', 1))
 # (1, ('b', 'banana'))

Pero esto frustra el propósito de un diccionario (mapa, matriz asociativa) , que es una estructura de datos eficiente para búsquedas al estilo de una guía telefónica. El orden del diccionario puede ser secundario a la implementación y no se debe confiar en él. Si necesita el pedido, utilice OrderedDict en su lugar.

correcaminos66
fuente
2
No me permite hacer una edición de 2 caracteres en esta publicación, pero el OP marcó esto como para Python 3, por lo que la declaración de impresión debe tener paréntesis alrededor de k, v.
wp-overwatch.com
@Señor. Yo, ty, lo arreglaré.
roadrunner66
19
Esto debe tenerse en cuenta solo está disponible para python2. dict.iteritems () se eliminó en python3, consulte también stackoverflow.com/questions/30418481/…
gyger
1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz
Ty. Python3 actualizado vs python2. Se agregó un comentario sobre enumerar.
roadrunner66
5

Dado que está utilizando, por lo enumeratetanto, su ies en realidad el índice de la clave en lugar de la clave en sí.

Entonces, está ingresando 3en la primera columna de la fila 3 4aunque no haya una clave 3.

enumerate itera a través de una estructura de datos (ya sea una lista o un diccionario) mientras que también proporciona el número de iteración actual.

Por lo tanto, las columnas aquí son el número de iteración seguido de la clave en el diccionario. enum

Otras soluciones ya han mostrado cómo iterar sobre el par clave y valor, por lo que no repetiré lo mismo en el mío.

Ankur Ranjan
fuente
4

enumerate()cuando se trabaja en la lista, en realidad da el índice y el valor de los elementos dentro de la lista. Por ejemplo:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
    print(i, j)

da

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

donde la primera columna denota el índice del elemento y la segunda columna denota los elementos en sí.

En un diccionario

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
    print(i, j)

da la salida

0 0
1 1
2 2
3 4
4 5
5 6
6 7

donde la primera columna da el índice de los key:valuepares y la segunda columna denota el keysdel diccionario enumm.

Entonces, si desea que la primera columna sea la keysy la segunda columna values, mejor pruebe dict.iteritems()(Python 2) o dict.items()(Python 3)

for i, j in enumm.items():
    print(i, j)

salida

0 1
1 2
2 3
4 4
5 5
6 6
7 7

Voila

Abhishek Roy
fuente
1
Esto no es cierto para los diccionarios. Su código iterará sobre el diccionario usando un índice (para la iteración) pero sin dar las combinaciones clave-valor del diccionario. Utilice dict.items () en su lugar.
Matthias
sí, también puede seguir adelante con dict.items (). Gracias por la corrección.
Abhishek Roy
3

Eso seguro debe parecer confuso. Entonces esto es lo que está pasando. El primer valor de enumerate (en este caso i) devuelve el siguiente valor de índice comenzando en 0, por lo que 0, 1, 2, 3, ... Siempre devolverá estos números independientemente de lo que esté en el diccionario. El segundo valor de enumerate (en este caso j) devuelve los valores en su diccionario / enumm (lo llamamos diccionario en Python). Lo que realmente quieres hacer es con lo que respondió roadrunner66.

wp-overwatch.com
fuente
3
  1. Iterar sobre un dictado de Python significa iterar sobre sus claves exactamente de la misma manera que con dict.keys()
  2. El orden de las claves está determinado por el código de implementación y no puede esperar un orden específico:

    Las claves y los valores se repiten en un orden arbitrario que no es aleatorio, varía entre las implementaciones de Python y depende del historial de inserciones y eliminaciones del diccionario. Si las claves, los valores y las vistas de elementos se repiten sin modificaciones en el diccionario, el orden de los elementos se corresponderá directamente.

Es por eso que ve los índices de 0 a 7 en la primera columna. Son producidos por enumeratey siempre en el orden correcto. Además, verá las claves de 0 a 7 del dictado en la segunda columna. No están ordenados.

VPfB
fuente
3

Python3:

Una solución:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
    print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

Otro ejemplo:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
     2 : {'a': 10, 'b' : 20, 'c' : 30}
    }    
for i, k in enumerate(d):
        print("{}) key={}, value={}".format(i, k, d[k])

Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}
Kostiantyn Medvid
fuente
1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

print("List of enumerated d= ", list(enumerate(d.items())))

salida:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]
usuario3358337
fuente
0

Puede resultarle útil incluir la clave interna del índice:

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

Salida:

{(0, 'a'): True, (1, 'b'): False}
GGGuser
fuente