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

Ну, вы действительно не обновляют список с этим один, вы только обновление кортежа. –

+0

Правильно, поэтому что-то вроде 'tuple_list [i] = (a, newB)' ... кроме того, что я хочу избежать этого внутри цикла. Мне любопытно, есть ли более чистый способ. – Clev3r

+1

@Clever: Цикл, который вы дали, в порядке; он не перебирает список, который вы обновляете, а только индексы. Это полностью стандартный способ работы со списками, если вы не меняете количество элементов в списке, а это не так. –

ответ

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 (...)', когда будет выполняться только '(...)'? –

+0

просто для того, чтобы быть более читаемым. там была дыра. –

+0

Я не считаю, что это более читаемо; он вместо этого отвлекает, это заставляет меня думать, что вы вместо этого добавляете другой тип последовательности в кортеж. –

Смежные вопросы