2013-02-14 113 views
11

我正在尋找一種乾淨的方式來迭代元組列表,其中每個元組都像這樣[(a, b), (c,d) ...]。最重要的是,我想改變列表中的元組。迭代元組列表

標準做法是避免在更改列表的同時迭代它,所以我該怎麼做?這是我有點想:

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

好了,你沒有真正有一個更新列表,你只更新元組。 – 2013-02-14 17:07:52

+0

對,就像'tuple_list [i] =(a,newB)'......除了我想避免在循環內部這樣做。我很好奇,如果有更清潔的方式。 – Clev3r 2013-02-14 17:08:33

+1

@Clever:你給的循環很好;它不會遍歷你正在更新的列表,而只是索引。這是使用列表的一種完全標準的方式,只要您不更改列表中的元素數量,而不是。 – 2013-02-14 17:11:19

回答

29

只需替換列表中的元組;你可以改變列表,而遍歷它,只要你避免添加或刪除元素:

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

,或者如果可以總結所做的更改b到函數就像我上面一樣,使用列表理解:

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

你爲什麼不走了列表理解,而不是改變它呢?

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

這裏有一些想法:

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

爲什麼只有'(...)'會使用'tuple(...)'? – 2013-02-14 17:11:25

+0

只是爲了更具可讀性。那裏有一大堆括號。 – 2013-02-14 17:58:23

+0

我不認爲這是更可讀;它反而分散注意力,它使我認爲你將另一個序列類型轉換爲一個元組。 – 2013-02-14 17:59:13