2012-08-01 22 views
9

ich hinzufüge, in den Wert Abschnitt eines Wörterbuchs einen Namen und den Wert der Eigenschaften eines Elements:Python for-Schleife Zugriff zwei Elemente zu einer Zeit

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

Jedes Stück Text durch einen Tabulator getrennt wird . Wenn ich diesen Wert später verarbeite, spalte ich die Tabs und lasse eine For-Schleife über die Liste laufen.

Wie kann ich auf den Namen und Wert in der for-Schleife zugreifen. Wie für jede Eigenschaft möchte ich den Namen und Wert auf einmal erhalten und in eine Datei schreiben. Derzeit sieht die Liste wie:

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

und für jedes a, b ich schreiben möchte:

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

+0

Verwenden Sie niemals + = bei einer großen Anzahl von String-Verkettungen. Machen Sie iterable und verwenden Sie stattdessen join –

Antwort

16

Sie können mit Schrittgröße 2, über die Liste iterieren und den Namen bekommen und sich jeweils über jede Iteration Tag ...

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

Bearbeiten: Wenn Ihre Schlüssel sind einzigartig, und die Reihenfolge keine Rolle spielt, dann ...

Ich glaube, Sie sollten convert your list to a dictionary, und dann durchlaufen die Schlüssel des Wörterbuchs:

# assuming you converted your list to a dictionary called values 

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

bearbeiten Wenn Sie das Wörterbuch für nichts anderes als das Ausdrucken des Ergebnisses benötigen, ist die andere Antwort wahrscheinlich eine bessere Methode.

+0

Wenn sie natürlich anders als name: value zusammenpassen, wie es für ein Dictionary-Mapping typisch ist, möchten Sie sie vielleicht als Tupel speichern. – CosmicComputer

+0

Während ich insgesamt mit Ihnen übereinstimme, dass ein "Diktat" eine nette Lösung ist, ist die Konvertierung in diesem Fall nicht trivial. Das OP müsste beim Auffüllen des "dict" vorsichtig sein, um zu prüfen, ob ein Schlüssel bereits existiert - anstatt ihn zu überschreiben, müssten sie an den Wert anhängen. – jmetz

+0

Nicht dicts auch verlieren Reihenfolge? –

4

Zunächst einmal ist die Verwendung von String + = String2 eine schlechte Idee, wie jedes Mal, wenn es in eine neue Zeichenfolge kopiert.

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

sollte

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

dann sein, wenn Sie einfach drucken,

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

tun, wenn aus irgendeinem Grund, die Sie wirklich die Registerkarten wollen, dann werden Sie die Werte Konstruktor ändern müssen zu einer Liste (von einem Generator) und tun:

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

Während meine Antwort die Frage am direktesten beantwortet, denke ich, dass dies der beste (und pythonischste) Ansatz bisher ist, wenn es dem OP nichts ausmacht, vom Listenansatz wegzuwechseln. – jmetz

+0

Vereinbart, Tabs als Trennzeichen zu verwenden, das Sie dann an anderer Stelle aufteilen, macht überhaupt keinen Sinn, das ist ein viel sauberer/besser Ansatz. –

Verwandte Themen