2016-11-08 2 views
2

Я новичок в Python и пытаюсь выяснить, как решить следующую проблему. У меня есть два списка, песни1 выглядит следующим образом:Инкремент переменной внутри цикла

['10','12','12','23] 

И песни2 выглядит следующим образом:

['15','16','13','15'] 

У меня также есть словарь, состоящий из следующих ключевых значений:

dictionary = { 
'10': 'AATGCGTAAGCTAGCGATAGATGCAACGTT', 
'12': 'GGTCAGAGTTTATCGGTATGTTAGCATGGA', 
'23': 'ATGGGCGCGTATATTAAAGGCGCCGCCCTG' 
} 

Ключи в этом словаре состоят из этих элементов в списке1. Каждый элемент в списке1 также связан с одним элементом в списке2 (для того, чтобы «10» в списке1 ассоциировался с «15» в списке2, «12» в списке1 с «16» в списке2 и т. Д.).

Для каждого элемента в списке1 я хотел бы взять соответствующее значение словаря и вставить символы в определенные позиции, используя связанный элемент в списке2, чтобы определить позиции. До сих пор я работал на цикл, чтобы сделать это:

for i in list1: 
    dict_key = dictionary.get(i) 
    pos = int(list2[0]) 
    full = dict_key[:pos] + '[' + dict_key[pos] + ']' + dict_key[(pos+1):] 
    print(full) 

Я хотел бы мой окончательный вывод выглядеть следующим образом:

AATGCGTAAGCTAGC[G]ATAGATGCAACGTT 
GGTCAGAGTTTATCGG[T]ATGTTAGCATGGA 
GGTCAGAGTTTAT[C]GGTATGTTAGCATGGA 
ATGGGCGCGTATATT[A]AAGGCGCCGCCCTG 

Но мой выход в настоящее время выглядит следующим образом, потому что я в частности, называя только индексом 0 из list2:

AATGCGTAAGCTAGC[G]ATAGATGCAACGTT 
GGTCAGAGTTTATCG[G]TATGTTAGCATGGA 
GGTCAGAGTTTATCG[G]TATGTTAGCATGGA 
ATGGGCGCGTATATT[A]AAGGCGCCGCCCTG 

Я хочу, чтобы увеличить элемент, который вызывается для в list2 на 1 с каждой итерации цикла, но я не могу показаться, чтобы выяснить это. Должен ли я определять новую переменную с использованием диапазона? Любые комментарии будут оценены!

ответ

2

Просто изменить for i in list1: к for i, pos in zip(list1, list2): и удалить назначение pos во второй строке цикла. zip позволит вам перебирать оба списка одновременно.

+0

Спасибо за это решение @Randy C!Очень просто и делает то, что я хотел, также будет полезно знать в целом. Еще раз спасибо! – nrcombs

1

Использование enumerate полезно в таких ситуациях - оно дает вам кортеж, содержащий положение каждого элемента и самого элемента. Заметьте, я изменил значение i на то, чтобы обозначить позицию элемента, а не элемент.

Ваша переменная dict_key вероятно было бы лучше назвать dict_value, так как элемент в list1 на самом деле ключ, который вы ищете в dictionary.

for i, el in enumerate(list1): 
    dict_value = dictionary.get(el) 
    pos = int(list2[i]) 
    full = dict_value[:pos] + '[' + dict_value[pos] + ']' + dict_value[(pos+1):] 
    print(full) 
+0

Также очень полезно, спасибо @enigma, я раньше не использовал перечисление. – nrcombs

0

Вы можете создавать итераторы для списков (например, int(i) for i in list2 итерацию list2, преобразование его значения int на пути) и использовать zip читать их в парах.

list1 = ['10','12','12','23'] 
list2 = ['15','16','13','15'] 

dictionary = { 
'10': 'AATGCGTAAGCTAGCGATAGATGCAACGTT', 
'12': 'GGTCAGAGTTTATCGGTATGTTAGCATGGA', 
'23': 'ATGGGCGCGTATATTAAAGGCGCCGCCCTG' 
} 

for val, pos in zip((dictionary[j] for j in list1), (int(i) for i in list2)): 
    full = val[:pos] + '[' + val[pos] + ']' + val[(pos+1):] 
    print(full) 

Некоторые люди предпочитают строки форматирования, чтобы построить результирующую строку

full = '{}[{}]{}'.format(val[:pos], val[pos], val[pos+1:]) 

но это личный вкус.

+0

Спасибо @tdelaney, дает мне то, что я хочу, и теперь я знаю о итераторах списка. – nrcombs