2012-08-01 10 views
9

estoy añadiendo a la sección de valor de un diccionario un nombre y el valor de las propiedades de un elemento:Python para el acceso al bucle de dos elementos a la vez

value+=child.get('name') + '\t' + child.text + '\t' 

cada parte del texto está separado por una pestaña . Entonces, cuando proceso esta cadena de valor más tarde, me divido en las pestañas y tengo un bucle for para iterar sobre la lista.

¿Cómo puedo acceder tanto al nombre como al valor en el ciclo for? En cuanto a cada propiedad, quiero obtener el nombre y el valor de una vez y escribirlo en un archivo. Actualmente la lista se parece a:

[a, b, a, b, a, b, a, b]

y para cada a, b Quiero escribir: Etiqueta

'<' nombre = a '>' b '<'/tag '>'

+0

Nunca use + = en grandes cantidades de concatenaciones de cadenas. Cree un join iterable y use en su lugar –

Respuesta

16

puede iterar sobre la lista con el tamaño del paso 2, y obtener el nombre y la etiqueta de cada uno durante cada iteración ...

for i in range(0,len(list1),2): 
    name = list1[i] 
    tag = list1[i+1] 
    print '<tag name="%s">%s</tag>' % (name, tag) 
4

Editar: Si sus claves son únicas, y el orden no importa, entonces ...

creo que deberías convert your list to a dictionary, y luego iterar sobre las claves del diccionario:

# assuming you converted your list to a dictionary called values 

for k in values: 
    print '<tag name="%s">%s</tag>' % (k, values[k]) 

Editar : Si no necesita el diccionario para nada más que imprimir el resultado, entonces la otra respuesta que se publicó es probablemente un método mejor.

+0

Si, naturalmente, van de la mano de alguna otra manera que no sea nombre: valor, como es típico para un mapeo de diccionario, es posible que desee almacenarlos como tuplas. – CosmicComputer

+0

Aunque tiendo a estar de acuerdo contigo en general en que un 'dict' es una buena solución, la conversión en este caso no es trivial. El OP debería tener cuidado al rellenar el 'dict' para verificar si ya existe una clave; en lugar de sobreescribirla, tendría que agregarla al valor. – jmetz

+0

¿No los dictados también pierden el orden? –

4

Primero, usar string + = string2 es una mala idea, ya que cada vez se copia a una nueva cadena.

value+=child.get('name') + '\t' + child.text + '\t' 

debe ser

values = ((child.get('name'),child.text) for child in children) 

entonces cuando se imprime, haga simplemente

for name,text in values: 
    print '<tag name="{name}">{text}</tag>'.format(name=name,text=text) 

si por alguna razón, usted realmente quiere las pestañas, entonces usted tendrá que cambiar el constructor valores a una lista (de un generador) y hacer:

''.join((name+'\t'+value+'\t' for name,value in values))[:-1] 
+0

Si bien mi respuesta responde la pregunta más directamente, creo que este es el mejor enfoque (y el más pitónico) hasta ahora si al OP no le importa cambiar de enfoque de lista. – jmetz

+0

De acuerdo, usar pestañas como un delimitador que luego se divide en otro lugar no tiene ningún sentido, este es un enfoque mucho más limpio/mejor. –

Cuestiones relacionadas