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必须具有相同的长度。”使用我的第二个解决方案,您可以具有一对多的翻译。谢谢