2013-05-13 2 views
-4

Мне нужно создать еще много файлов в каталоге, таким образом, я хочу, чтобы это было сделано программически. Я выбрал питона, но как решить следующую проблемуКак изменить запись списка в python 2.x, используя цикл

У меня есть список

L = [ «а», «б», «с»]

Теперь я хочу изменить запись в списке L, как показано ниже

L = [ 'a.txt', 'b.txt', 'c.txt']

Как это сделать?

+6

Пожалуйста, не редактируйте ваши вопросы, чтобы существующие ответы недействительны, и вместо того, чтобы просить людей писать код для вас, по крайней мере покажите, что вы пробовали до сих пор (хотя, честно говоря, 4 человека, которые написали вам код, вероятно, просто напишут вам больше, даже если вы не показывай никаких усилий ...) – geoffspear

ответ

2

Чтобы изменить список, перебрать его, используя индексы:

for i in range(len(L))): 
    L[i] += '.txt' 

Однако в этом случае вы действительно не нужно, чтобы изменить список, так что вы, вероятно, хотите использовать список comrehension, как это было предложено by @Ashwini Chaudhary. Однако, используя список понимание создает новый список, так что вы можете назначить его снова в L:

L = [s + '.txt' for s in L] 

Но, если исходная переменная L является глобальной или нелокальной переменной, приведенное выше утверждение создаст новый, локальная переменная , которые исчезают в конце текущей функции, и может создать беспорядок, если вы пытались получить доступ к нему до asssignment:

>>> L = ['a', 'b', 'c'] 
>>> def addtxt(): 
...  print(L) 
...  L = [s + '.txt' for s in L] 
... 
>>> addtxt() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in addtxt 
UnboundLocalError: local variable 'L' referenced before assignment 

Вам нужно будет добавить global (или nonlocal в другом случае) декларации. Это не чистый способ справиться с этим.

Таким образом, совмещая в месте замены с пониманием списка, вы получите предложение от @Jamylak

L[:] = [s + '.txt' for s in L] 

где [:] означает, что содержание списка будет заменен на правой стороне задания. Это не приведет к добавлению локальной привязки и будет помещаться в любом месте, где будет соответствовать вышеупомянутый цикл.

3
>>> L=['a','b','c'] 
>>> L[:] = [x + '.txt' for x in L] 
>>> L 
['a.txt', 'b.txt', 'c.txt'] 

Назначение ломтика [:] используется для мутировать L себя и сохранить ссылки. например. Это то, что произойдет, если вы не используете его

>>> L=['a','b','c'] 
>>> L2 = L # you may have a reference like this in your code somewhere 
>>> L = [x + '.txt' for x in L] # this simply reassigns the name L to a new value 
>>> L 
['a.txt', 'b.txt', 'c.txt'] 
>>> L2 # but doesn't affect the name L2 which is still binded to the old list 
['a', 'b', 'c'] 
+0

+1 для 'L [:]', его чище. –

2

Немного проще, чем предыдущий ответ:

L = [i + '.txt' for i in L] 

или

for i, string in enumerate(L): 
    L[i] = string + '.txt' 
+0

Первый вариант не является семантически эквивалентным второму.Второй имеет недостаток псевдонимов 'L [i]' с 'string', что делает его несколько запутанным. Я думаю, что '+ =' лучше. – Elazar

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