range(),带有可变步长整数值

时间:2017-06-30 20:29:30

标签: 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 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就好了。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

完全正常运行的第二版功能,包括一对多翻译。 精制:7-5-2017

public Form1()
{
    InitializeComponent();

    BackgroundWorker bw = new BackgroundWorker();
    bw.WorkerSupportsCancellation = true;
    bw.WorkerReportsProgress = true;
    bw.DoWork += (s, ev) => calculate();
    bw.RunWorkerCompleted += (s, ev) => show();
    bw.RunWorkerAsync();
}

private void calculate()
{
     // Do some heavy work
     Thread.Sleep(5000);
}

private void show()
{
    MessageBox.Show("aaaaaa");

    PictureBox load = new PictureBox();
    load.BackColor = Color.White;
    load.Width = this.Width;
    load.Height = this.Height;
    load.Left = 0;
    load.Top = 0;
    load.Name = "load";

    this.Controls.Add(load);
    load.BringToFront();

    MessageBox.Show("bbbbb");
}

输出: 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])