2013-02-14 11 views
11

Ich bin auf der Suche nach einem sauberen Weg, um über eine Liste von Tupeln zu iterieren, wo jeder ein Paar wie so ist [(a, b), (c,d) ...]. Außerdem möchte ich die Tupel in der Liste ändern.Iterieren Sie eine Liste von Tupeln

Die übliche Vorgehensweise besteht darin, zu vermeiden, dass eine Liste geändert wird, während sie auch durchlaufen wird. Was soll ich also tun? Hier ist, was ich irgendwie wollen:

for i in range(len(tuple_list)): 
    a, b = tuple_list[i] 
    # update b's data 
    # update tuple_list[i] to be (a, newB) 
+0

Nun, du bist nicht wirklich die Liste mit, dass ein Aktualisieren Sie nur die Tupel zu aktualisieren. –

+0

Richtig, also etwas wie 'tuple_list [i] = (a, newB)' ... außer dass ich das in der Schleife vermeiden möchte. Ich bin gespannt, ob es einen saubereren Weg gibt. – Clev3r

+1

@Clever: Die Schleife, die Sie gegeben haben, ist in Ordnung; Es durchläuft nicht die Liste, die Sie aktualisieren, sondern nur die Indizes. Dies ist eine vollständig standardmäßige Möglichkeit, mit Listen zu arbeiten, solange Sie nicht die Anzahl der Elemente in der Liste ändern, die Sie nicht sind. –

Antwort

29

Ersetzen Sie einfach die Tupel in der Liste; Sie können eine Liste ändern, während darüber Looping, so lange wie Sie vermeiden, Hinzufügen oder Entfernen von Elementen:

for i, (a, b) in enumerate(tuple_list): 
    new_b = some_process(b) 
    tuple_list[i] = (a, new_b) 

oder, wenn Sie die Änderungen b in eine Funktion zusammenfassen kann, wie ich oben, eine Liste verwendet haben Verständnis:

tuple_list = [(a, some_process(b)) for (a, b) in tuple_list] 
4

Warum gehst du nicht für eine Liste Verständnis, anstatt sie zu verändern?

new_list = [(a,new_b) for a,b in tuple_list] 
0

sind hier einige Ideen:

def f1(element): 
    return element 

def f2(a_tuple): 
    return tuple(a_tuple[0],a_tuple[1]) 

newlist= [] 
for i in existing_list_of_tuples : 
    newlist.append(tuple(f1(i[0]) , f(i1[1])) 

newlist = [ f2(i) for i in existing_list_of_tuples ] 
+1

Warum 'tuple (...)' verwenden, wenn nur '(...)' tun würde? –

+0

nur um besser lesbar zu sein. Da war ein Loch voller Klammern. –

+0

Ich finde das nicht lesbarer; Es lenkt ab, es lässt mich denken, dass Sie stattdessen einen anderen Sequenztyp in ein Tupel umwandeln. –

Verwandte Themen