我是Python的新手,正在试图弄清楚如何解决以下问题。我有两个列表,list1看起来像这样:
[pytest]
addopts = --reuse-db
DJANGO_SETTINGS_MODULE=mysite.settings
list2看起来像这样:
['10','12','12','23]
我还有一个由以下键值组成的字典:
['15','16','13','15']
此词典中的键由list1中的那些元素组成。 list1中的每个元素也与list2中的单个元素相关联(按顺序,list1中的' 10与list2中的''' 12' ;在list1中,列表2中包含' 16'等等。
对于list1中的每个元素,我想获取相关的字典值,并使用list2中的关联元素将字符插入特定位置以确定位置。到目前为止,我一直在研究for循环:
dictionary = {
'10': 'AATGCGTAAGCTAGCGATAGATGCAACGTT',
'12': 'GGTCAGAGTTTATCGGTATGTTAGCATGGA',
'23': 'ATGGGCGCGTATATTAAAGGCGCCGCCCTG'
}
我希望我的最终输出看起来像这样:
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)
但我的输出目前看起来像这样,因为我特别要求list2中的索引0:
AATGCGTAAGCTAGC[G]ATAGATGCAACGTT
GGTCAGAGTTTATCGG[T]ATGTTAGCATGGA
GGTCAGAGTTTAT[C]GGTATGTTAGCATGGA
ATGGGCGCGTATATT[A]AAGGCGCCGCCCTG
我想在循环的每次迭代中将list2中要求的元素增加1,但我似乎无法弄明白。我应该使用范围定义新变量吗?任何意见将不胜感激!
答案 0 :(得分:2)
只需将for i in list1:
更改为for i, pos in zip(list1, list2):
,然后在循环的第二行中删除pos
的分配。 zip
会让您一次遍历两个列表。
答案 1 :(得分: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)
答案 2 :(得分: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:])
但这是个人品味。