#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)