123 votos

¿Por qué tienes que llamar .iteritems() cuando iteración un diccionario en python.

¿Por qué tienes que llamar iteritems() para iterar por clave, valor pares en un diccionario? ie

dic = {'one':'1', 'two':'2'}
for k, v in dic.iteritems():
    print k, v

¿Por qué no es el comportamiento predeterminado de iteración un diccionario

for k, v in dic:
    print k, v

163voto

Alex Martelli Puntos 330805

Para cada python contenedor C, la expectativa es que

for item in C:
    assert item in C

va a pasar bien-no se encuentra es sorprendente si un sentido de in (el bucle de la cláusula) tenía un significado completamente diferente de la otra (la comprobación de la presencia)? Estoy seguro que sí! Naturalmente funciona de esa manera para las listas, conjuntos, tuplas, ...

Así, cuando C es un diccionario, si in fueron para el rendimiento de clave/valor de tuplas en un for bucle, entonces, por el principio de la menor sorpresa, in también tendría que tomar una tupla como su mano izquierda operando en la contención de verificación.

De lo útil que sería? Bastante inútil, de hecho, básicamente haciendo if (key, value) in C sinónimo if C.get(key) == value - que es un cheque, yo creo que puede haber realizado, o quería realizar, 100 veces más raramente de lo if k in C realmente significa, la comprobación de la presencia de la clave única y completamente por alto el valor.

Por otro lado, con ganas de bucle de las teclas es bastante común, por ej.:

for k in thedict:
    thedict[k] += 1

tener el valor de no ayudaría en particular:

for k, v in thedict.items():
    thedict[k] = v + 1

en realidad un poco menos claro y menos conciso. (Tenga en cuenta que items fue la ortografía original de la "correcta" de los métodos a utilizar para obtener los pares clave/valor: por desgracia, eso fue en los días cuando tales descriptores de acceso devuelto toda las listas, así que a apoyar "sólo la iteración" una ortografía alternativa tuvo que ser introducido, y iteritems era -- en Python 3, donde compatibilidad hacia atrás las limitaciones con las anteriores versiones de Python fueron muy debilitado, se convirtió items de nuevo).

8voto

John Kugelman Puntos 108754

Mi conjetura: el Uso de la tupla completa sería más intuitivo para el traspaso, pero quizás no tanto para la prueba de pertenencia mediante in.

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

Ese código no funciona realmente si tuviera que especificar la clave y el valor de in. Estoy teniendo un tiempo difícil imaginar caso de uso donde te gustaría comprobar si la clave Y valor están en el diccionario. Es mucho más natural que sólo la prueba de las llaves.

# When would you ever write a condition like this?
if (key, value) in dict:

Ahora no es necesario que el in operador y for ... in funcionar a través de los mismos elementos. La implementación sabios que son diferentes de las operaciones (__contains__ vs. __iter__). Pero que poco incoherencia sería algo confuso y, además, incoherente.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: