【发布时间】:2017-06-30 20:29:30
【问题描述】:
以下代码完全按照预期工作:
dnasequences = [
'GCTAGCTAGCTAGCTA',
'CTAGCTAGCTAGCTAG',
'TAGCTAGCTAGCTAGC',
'AGCTAGCTAGCTAGCT'
]
xlate = {'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'}
def dna2rna(sequences):
rnalist = [xlate[n] for sequence in sequences for n in sequence]
return rnalist
rnasequences = dna2rna(dnasequences)
print([''.join(rnasequences[i:i+16]) for i in range(0, len(rnasequences), 16)])
它返回: ['CGAUCGAUCGAUCGAU','GAUCGAUCGAUCGAUC','AUCGAUCGAUCGAUCG','UCGAUCGAUCGAUCGA']
我正在尝试修改它,以便 dnasequences() 中的 DNA 序列可以是任何可变长度。
我很接近这个:
dnasequences = [
'GCTAGCTA',
'CTAGCTAGCTAGCTAG',
'TAGCTAGCTAGCTAGC',
'AGCTAGCTAGCTAGCT'
]
xlate = {'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'}
def dna2rna(sequences):
rnalist = [xlate[n] for sequence in sequences for n in sequence]
seqlen = [len(sequence) for sequence in sequences]
return rnalist, seqlen
def printxlate(rnasq, lens):
index = 0
for i in range(0, len(rnasq), lens[index]):
print([''.join(rnasq[i:i+lens[index]])])
index += 1
rnasequences, seqlens = dna2rna(dnasequences)
printxlate(rnasequences, seqlens)
它正确地打印了前两个翻译的序列,但从第三个开始它就关闭了(尽管我确实有第二个问题:在第二个程序版本中,我在 dnasequences() 中为每个序列获取了一个单独的列表, 这是我不想要的。我想要一个包含四个元素的列表,就像第一个版本一样。)
在第一次迭代中 i = 0。 在第二次迭代中 i = 8。到目前为止一切顺利。
但在第三次迭代中(在 PyCharm 调试器中)我看到 i = 16。 我认为应该是24。既然不是,第三和第四翻译 错误,并出现“索引超出范围”错误。
如果第三次迭代是 i = 24 并且第四次 i = 40 它将起作用。
我只是不明白为什么它让前两次迭代正确,然后在第三次开始失败。
在第一个程序中,'i' 遍历 0、16、32 和 48 就可以了。
【问题讨论】:
标签: python list range list-comprehension python-3.6