2012-08-01 14 views
9

sto aggiungendo nella sezione valore di un dizionario un nome e il valore di proprietà di un articolo:Python per l'accesso alla rete due elementi alla volta

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

Ogni parte di testo è separato da una scheda . Quindi, quando elaborerò questa stringa di valori in seguito, dividerò le schede e avrò un ciclo for per scorrere l'elenco.

Come accedere al nome e al valore nel ciclo for. Come per ogni proprietà, voglio ottenere il nome e il valore in un colpo solo e scriverlo in un file. Attualmente la lista si presenta come:

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

e per ogni a, b voglio scrivere: tag

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

+0

Non usare mai + = su un numero elevato di concatenazioni di stringhe. Crea un iterable e usa join invece –

risposta

16

È possibile iterare la lista con passo 2, e ottenere il nome e contrassegnare ogni oltre ogni iterazione ...

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

Modifica: Se le chiavi sono uniche, e l'ordine non importa, allora ...

penso che si dovrebbe convert your list to a dictionary, e poi scandire le chiavi del dizionario:

# assuming you converted your list to a dictionary called values 

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

Edit : Se non hai bisogno del dizionario per qualcosa, ma stampa il risultato, allora l'altra risposta che è stata pubblicata è probabilmente un metodo migliore.

+0

Se naturalmente vanno insieme in un modo diverso dal nome: value, come è tipico per un mapping di dizionario, potresti volerli memorizzare come tuple. – CosmicComputer

+0

Mentre tendo ad essere d'accordo con te nel complesso che un 'dict' è una buona soluzione, la conversione in questo caso non è banale. L'OP dovrebbe fare attenzione quando si compila il 'dict' per verificare se esiste già una chiave - invece di sovrascriverlo dovrebbero aggiungere al valore. – jmetz

+0

I dit non perdono anche l'ordine? –

4

Prima di tutto, usare string + = stringa2 è una cattiva idea, poiché ogni volta copia su una nuova stringa.

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

dovrebbe essere

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

poi quando si stampa, è sufficiente fare

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

se per qualche motivo, si vuole veramente le schede, poi si dovrà cambiare il costruttore valori a un elenco (da un generatore) e fare:

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

Mentre la mia risposta risponde alla domanda più direttamente, penso che questo sia l'approccio migliore (e più pitonioso) fino ad ora se all'OP non importa passare dall'approccio alla lista. – jmetz

+0

D'accordo, l'uso di tabulazioni come delimitatore che hai diviso altrove non ha alcun senso, questo è un approccio molto più pulito/migliore. –

Problemi correlati