2016-11-08 171 views
2

我是Python新手,正在努力弄清楚如何解決以下問題。我有兩個列表,列表1是這樣的:for循環內增量變量

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

和List2是這樣的:有

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

我還包括以下關鍵值的字典:

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

這個詞典中的鍵由list1中的那些元素組成。 list1中的每個元素還與list2中的單個元素相關聯(按順序,使得list1中的'10'與list2中的'15'相關聯,列表1中的'12'與列表2中的'16'等)。

對於list1中的每個元素,我想獲取關聯的字典值,並使用list2中的關聯元素將字符插入到特定位置以確定位置。到目前爲止,我一直工作在一個循環做到這一點:

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 

但我目前輸出看起來像這樣因爲我特別是從列表2呼籲只指數0:

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

我想提高這就是所謂的在列表2 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