2013-02-14 114 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