Замененные элементы списка не переносятся за пределы цикла Python

#python #list #variables #indexing #scope

Вопрос:

Я пытаюсь преобразовать список цифр в буквы и задаюсь вопросом, почему мои преобразования не переносятся за пределы цикла for. Это ошибка с областью действия? Я приношу извинения за любой плохо написанный код, я новичок в изучении Python. Большое спасибо.

 cstring = [0, 3, 2, 1, 0, 0, 1, 3]

for number in cstring:
    if number == 0:
        number = 'A'
    elif number == 1:
        number = 'C'
    elif number == 2:
        number = 'G'
    elif number == 3:
        number = 'T'

print(cstring)
 

выход равен 0 3 2 1 0 0 1 3. Это должно быть ATGCAACT.

Ответ №1:

вы можете использовать перечисление и замену по индексу !!

 cstring = [0, 3, 2, 1, 0, 0, 1, 3]

for num,ele in enumerate(cstring):
    if ele == 0:
        cstring[num] = 'A'
    elif ele == 1:
        cstring[num] = 'C'
    elif ele == 2:
        cstring[num] = 'G'
    elif ele == 3:
        cstring[num] = 'T'

print("".join(cstring))
 

Комментарии:

1. Не очень хорошая идея изменять список во время его просмотра. В данном случае это не повредит, но это плохая практика.

2. Спасибо за ваше предложение, я только что прочитал некоторые материалы, относящиеся к этому, которые я буду иметь в виду!!

Ответ №2:

Когда вы говорите number = 'A' , вы просто меняете значение number переменной. Эта переменная не имеет никакого отношения к старому списку. Лучший способ справиться с чем-то подобным-создать новый список с новыми значениями:

 cstring = [0, 3, 2, 1, 0, 0, 1, 3]
dna = []

for number in cstring:
    if number == 0:
        dna.append('A')
    elif number == 1:
        dna.append('C')
    elif number == 2:
        dna.append('G')
    elif number == 3:
        dna.append('T')
print(dna)
 

но есть способы и получше.

 dna = ["ACGT"[number] for number in cstring]
 

Ответ №3:

Цикл for копирует каждое значение из массива в переменную цикла number . Поскольку мы просто копируем значение, подобное присвоение number = 'A' не влияет на исходный массив.

Вместо этого вы должны использовать назначения с самим массивом, т. Е. Вместо этого сделать что-то подобное cstring[i] = 'A' . Попробуйте изменить цикл for, чтобы он был

 for i in range(len(cstring)):
 

Ответ №4:

Чтобы изменить переменную в массиве, необходимо определить ее индекс. Вы могли бы сделать это, создав переменную, которая перемещается по циклу for, представляющему текущий индекс.

 cstring = [0, 3, 2, 1, 0, 0, 1, 3]

i = 0
for number in cstring:
i  = 1
    if number == 0:
        number[i] = 'A'
    elif number == 1:
        number[i] = 'C'
    elif number == 2:
        number[i] = 'G'
    elif number == 3:
        number[i] = 'T'

print(cstring)