Python 带可变步长整数值的range()
以下代码完全按照预期工作:Python 带可变步长整数值的range(),python,list,range,list-comprehension,python-3.6,Python,List,Range,List Comprehension,Python 3.6,以下代码完全按照预期工作: dnasequences = [ 'GCTAGCTAGCTAGCTA', 'CTAGCTAGCTAGCTAG', 'TAGCTAGCTAGCTAGC', 'AGCTAGCTAGCTAGCT' ] xlate = {'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'} def dna2rna(sequences): rnalist = [xlate[n] for sequence in sequen
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)])
它返回:
['CGAUCGAUCGAUG'、'CGAUCGAUC'、'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的步骤都很好。您遇到麻烦的原因是,您正在使用嵌套的表内理解来展平结果。如果您使用以下方法,则不必担心问题:
[[... for _ in string] for string in sequence]
# ^^^^ put the inner for loop here instead of at the end
第二种解决方案的一种变体是:
[''.join(xlate[l] for l in s) for s in dnasequences]
# ['CGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA']
str.translate
应该是更好的选择:
table = str.maketrans(xlate)
[s.translate(table) for s in dnasequences]
# ['CGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA']
您陷入麻烦的原因是,您正在通过使用嵌套的for-in-list理解来展平结果。如果您使用以下方法,则不必担心问题:
[[... for _ in string] for string in sequence]
# ^^^^ put the inner for loop here instead of at the end
第二种解决方案的一种变体是:
[''.join(xlate[l] for l in s) for s in dnasequences]
# ['CGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA']
str.translate
应该是更好的选择:
table = str.maketrans(xlate)
[s.translate(table) for s in dnasequences]
# ['CGAUCGAU', 'GAUCGAUCGAUCGAUC', 'AUCGAUCGAUCGAUCG', 'UCGAUCGAUCGAUCGA']
功能完善的第二版,包括一对多翻译。 精炼:2017年7月5日
from pprint import pprint
dnasequences = [
'GCTAGCTA',
'CTAGCTAGCTAGCTAG',
'TAGCTAGCTAGC',
'AGCTAGCTAGCTAGCTAGCT',
'GCTA',
'CTAGTAGCTGACTCAGTACGTACA'
]
xlate = {'G': 'abc', 'C': 'G', 'T': 'A', 'A': 'U'}
pprint([''.join(xlate[n] for n in sequence) for sequence in dnasequences])
输出:
['abcGAUabcGAU',
“gauabcgaucgaucgaucgaucgauabc”,
“AUabcGAUabcGAUabcG”,
“UABCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGA”,
"abcGAU",,
“Gauabcauabcgaabcugaguabcaubabcaugu”]
功能齐全的已更正第二版,包括一对多翻译。
精炼:2017年7月5日
from pprint import pprint
dnasequences = [
'GCTAGCTA',
'CTAGCTAGCTAGCTAG',
'TAGCTAGCTAGC',
'AGCTAGCTAGCTAGCTAGCT',
'GCTA',
'CTAGTAGCTGACTCAGTACGTACA'
]
xlate = {'G': 'abc', 'C': 'G', 'T': 'A', 'A': 'U'}
pprint([''.join(xlate[n] for n in sequence) for sequence in dnasequences])
输出:
['abcGAUabcGAU',
“gauabcgaucgaucgaucgaucgauabc”,
“AUabcGAUabcGAUabcG”,
“UABCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGAUCGA”,
"abcGAU",,
“Gauabcauabcgaabcugaguabcaubabcaugu”]
不幸的是,我在理解您的解决方案时遇到了困难(我对这一点还很陌生)。你到底对第二个程序做了什么修改?谢谢。修改是将n的按顺序
移动到列表理解的开头,这样就不会使结果变平。今天早上用一双新的眼睛再次查看。现在我得到您对我的第二个解决方案的修改。另外,maketrans()的文档说明翻译必须具有相同的长度:“注意:intab和outtab必须具有相同的长度。”使用我的第二个解决方案,您可以具有一对多的翻译。谢谢不幸的是,我在理解你的解决方案时遇到了困难(我对这个问题还是很陌生)。你到底对第二个程序做了什么修改?谢谢。修改是将n的按顺序
移动到列表理解的开头,这样就不会使结果变平。今天早上用一双新的眼睛再次查看。现在我得到您对我的第二个解决方案的修改。另外,maketrans()的文档说明翻译必须具有相同的长度:“注意:intab和outtab必须具有相同的长度。”使用我的第二个解决方案,您可以具有一对多的翻译。谢谢