簡體   English   中英

具有可變步長整數值的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)])

它返回:['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,而第四次迭代= 40,則它將起作用。

我只是不明白為什么它會使前兩個迭代正確,然后在第三個迭代上開始失敗。

在第一個程序中,“ i”逐步遍歷0、16、32和48。

遇到麻煩的原因是通過使用嵌套的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']

完整功能更正的第二版,包括一對多翻譯。 精致: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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM