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?


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

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

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)

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.


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.


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


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.


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.


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}

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

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}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.