【问题标题】:range() with variable step integer valuerange() 具有可变步长整数值
【发布时间】: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


    【解决方案1】:

    您遇到麻烦的原因是您通过在列表理解中使用嵌套的 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']
    

    【讨论】:

    • 不幸的是,我无法理解您的解决方案(我对此仍然很陌生)。你对第二个程序做了什么修改?谢谢。
    • 修改是将for n in sequence移动到列表解析的开头,这样你就不会弄平结果。
    • 今早又用一双新鲜的眼睛看了一遍。现在我得到你对我的第二个解决方案的修改。此外,maketrans() 的文档说翻译必须具有相同的长度:“注意:intab 和 outtab 必须具有相同的长度。”使用我的第二个解决方案,您可以进行一对多的翻译。谢谢!
    【解决方案2】:

    功能齐全的更正第二版,包括一对多翻译。 精制: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', 'GAUabcGAUabcGAUabcGAUabc', 'AUabcGAUabcGAUabcG', 'UabcGAUabcGAUabcGAUabcGAUabcGA', 'abcGAU', 'GAUabcAUabcGAabcUGAGUabcAUGabcAUGU']

    【讨论】:

      猜你喜欢
      • 2022-07-17
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2011-11-27
      相关资源
      最近更新 更多