2012-04-21 2 views
0

Я создал функцию и передаю функцию список строк, как это: ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']Изменение значения элемента в списке в Python для цикла

Я создал переменную X с 26 значениями; Я называю эти значения «карточкой» в моем коде ниже («для карты в X»).

Я использую itertools и списки для создания списка строк, чтобы каждое значение в X было заменено на «XX» в новом списке.

Например: ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX'] расширится ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc

я создаю список значений с именем TMP и подставляя список значений «X» (так называемый карт) для одного из элементов в TMP (так называемый «XX») с использованием цикла for.

unitoffive = list(itertools.combinations(unit,5)) 
newunit = [list(line) for line in unitoffive if 'XX' in line] 


tmp = [[line,card] for line in newunit for card in X] 
for line in tmp: 
    line[0][4] = line.pop(line.index(line[1])) 
    print line 

    for line in tmp: 
    print line 

Мой сценарий демонстрирует поведение, которое я не могу понять. Когда оператор строки печати в моем первом цикле for выполняется, я вижу измененный список, который я ожидаю. Когда вызывается второй оператор строки печати, я вижу другую и неправильную версию моего списка. Я не могу вернуться и использовать tmp, поскольку он только содержит правильные значения в цикле for, в котором он был изменен.

Я знаю, что списки Python могут быть сложными для изменения в цикле for, и я попытался изменить свой код на цикл за for line in tmp[:], но это не решило мою проблему.

Оператор печать строки в этом разделе коды отпечатков ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc как ожидалось:

for line in tmp: 
    line[0][4] = line.pop(line.index(line[1])) 
    print line 

оператора печать строки после него печатает ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'] etc

+1

Какой вклад вы даете сценарий? Какой результат вы получаете? Какой результат вы ожидали? Можете ли вы включить это в свой вопрос? –

+0

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

+0

Этот код делает то, что я ожидал бы, прочитав его и проверив его с помощью некоторых случайных строк. Я думаю, вам придется объяснить, что вы вкладываете, и что вы хотите получить. – senderle

ответ

1

Вы изменение [строка, карт] подсписки и ожидая список tmp должен иметь их копию, а не те же объекты. Попробуйте изменить:

for line in tmp: 

Для:

import copy 
for line in copy.deepcopy(tmp): 

И посмотреть, если он работает, как вы ожидаете.

редактировать

Похоже, это то, что вы хотите, чтобы добавить к inlist вместо вставки:

>>> line = [['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX'], ['value1']] 
>>> line[0].append(line.pop()[0]) 
>>> line 
[['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX', 'value1']] 
>>> 
+0

Замена строки в tmp для строки в копии.deepcopy (tmp) меняет мои результаты, но не так, как мне нужно. Вы убедили меня, что я действительно не понимаю некоторые аспекты списков python. Если я изменяю списки [line, card], которые создаются в tmp через список comp, то почему tmp не имеет их копию? – somas1

+0

tmp имеет копию подписок, но не элементов внутри них. –

+0

Вы уверены, что line.pop (1) - это то, что вы хотите сделать? pop удаляет этот элемент из списка, и вы не вставляете его снова, а усваиваете его кому-то другому. Вы значительно сокращаете свой список, итерации по нему, и поэтому печать после него дает другой результат. –