2008-10-06 22 views
18

Tengo una etiqueta de cadena de lista.Método de actualización del diccionario python

Estoy tratando de inicializar un diccionario con la clave como cadena de etiquetas y valores como el índice de la matriz.

for i, ithTag in enumerate(tag): 
    tagDict.update(ithTag=i) 

Los rendimientos por encima de mí { 'ithTag': 608} 608 es el índice 608a

Mi problema es que mientras que el i se interpreta como una variable, Python está tratando el "ithTag" como una cadena en lugar de una variable.

Estoy confundido, es un poco difícil googlear este tipo de preguntas específicas. Espero haber redactado correctamente el título de esta pregunta,

¡Gracias!

+0

Esta es una pregunta casi upvotable. Creo que solo la respuesta elegida es peor que [esta] (http://stackoverflow.com/a/179005/131120). ¿Te importa cambiar o explicar las razones detrás de elegir la respuesta for-loop? – erikbwork

+0

Elegí esa porque Jerub respondió primero; y acabo de marcarlo de inmediato. También proviene de un fondo C#/Java, la respuesta de Jerub me parece más familiar y me gustó su explicación de por qué .update() no funcionó para mí. – freshWoWer

Respuesta

46

que realmente quiere hacer esto: Método

for i, tag in enumerate(tag): 
    tagDict[tag] = i 

El .Update() se utiliza para la actualización de un diccionario utilizando otro diccionario, no para cambiar un solo par clave/valor.

2

creo que esto es lo que quiere hacer:

d = {} 
for i, tag in enumerate(ithTag): 
    d[tag] = i 
2

Trate

tagDict[ithTag] = i 
17

Si quieres ser inteligente:

tagDict.update(map(reversed, enumerate(tag))) 

Gracias a Brian para la actualización. Esto es aparentemente ~ 5% más rápido que la versión iterativa.

(EDIT: Gracias saverio por señalar mi respuesta era incorrecta (ahora fijado) Probablemente la forma más eficiente/Pythonic sería la respuesta de Torsten Marek, ligeramente modificado:.

tagDict.update((t, i) for (i,t) in enumerate(tag)) 

)

+0

En realidad, update() puede tomar una secuencia directamente, por lo que no es necesario construir un dict intermedio. Hacer tagDict.update (enumerate (tag)) es en realidad un poco (~ 5%) más rápido que la versión iterativa. – Brian

+2

Las claves de 'tagDict' tienen que ser los elementos de' tag'. Use 'tagDict.update (map (reversed, enumerate (tag)))', de hecho el equivalente funcional de la respuesta de Torsten Marek. – rewritten

+0

@Claudiu, porque, como ya mencionó saverio, 'tagDict.update (enumerate (tag))' hace índices como claves dict, mientras que deben ser valores – warvariuc

12

¡Es una sola línea:

tagDict = dict((t, i) for i, t in enumerate(tag)) 
+0

Creo que esta debería ser la respuesta aceptada, es más claro lo que está sucediendo aquí, no hay efectos secundarios de los que preocuparse. –

2

creo que lo que quiere es la siguiente:

for i, ithTag in enumerate(tag): 
    tagDict.update({ithTag: i}) 
Cuestiones relacionadas