具有可变步长整数值的 range()
range() with variable step integer value
以下代码完全按预期工作:
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)])
它returns:
['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。因为它不是,第三和第四个翻译
是错误的,它会出现 'index out of range' 错误。
如果第三次迭代是 i = 24,第四次迭代是 i = 40,它就可以工作。
我只是不明白为什么前两次迭代都是正确的,然后在第三次迭代时开始失败。
在第一个程序中 'i' 步进 0、16、32 和 48 就好了。
您遇到麻烦的原因是您通过在列表理解中使用嵌套的 for 来展平结果。如果您使用:
,则不必担心此问题
[[... 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']
功能齐全的修正后的第二个版本,包括一对多翻译。
精炼:7-5-2017
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',
'GAUabcGAUabcGAUabcGAUabc',
'AUabcGAUabcGAUabcG',
'UabcGAUabcGAUabcGAUabcGAUabcGA',
'abcGAU',
'GAUabcAUabcGAabcUGAGUabcAUGabcAUGU']
以下代码完全按预期工作:
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)])
它returns: ['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。因为它不是,第三和第四个翻译 是错误的,它会出现 'index out of range' 错误。
如果第三次迭代是 i = 24,第四次迭代是 i = 40,它就可以工作。
我只是不明白为什么前两次迭代都是正确的,然后在第三次迭代时开始失败。
在第一个程序中 'i' 步进 0、16、32 和 48 就好了。
您遇到麻烦的原因是您通过在列表理解中使用嵌套的 for 来展平结果。如果您使用:
,则不必担心此问题[[... 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']
功能齐全的修正后的第二个版本,包括一对多翻译。 精炼:7-5-2017
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',
'GAUabcGAUabcGAUabcGAUabc',
'AUabcGAUabcGAUabcG',
'UabcGAUabcGAUabcGAUabcGAUabcGA',
'abcGAU',
'GAUabcAUabcGAabcUGAGUabcAUGabcAUGU']