-1

我希望程序做的是获取与某个条形码相关的序列并执行定义的功能(序列的平均长度和标准偏差,减去条形码和不相关的 txt,由相同的条形码识别)。我写了一些类似的东西,并基于类似的程序,但我不断收到索引错误。这个想法是所有带有第一个条形码的序列都将被处理为barcodeCounter = 0,第二个被处理为barcodeCounter = 1,等等。希望这是足够的信息,如果它是混乱的,抱歉。

输入:

import sys
import math

def avsterr(x):
        ave = sum(x)/len(x)
        ssq = 0.0
        for y in x:
                ssq += (y-ave)*(y-ave)
        var = ssq / (len(x)-1)
        sdev = math.sqrt(var)
        stderr = sdev / math.sqrt(len(x))

        return (ave,stderr)

barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
barcodeCounter = 0
for barcode in b:
        barcodeCounter = barcodeCounter + 1
        barcode = barcode.strip()
        print "barcode: %s" %  barcode
        handle = open(sequence, "r")
        for line in handle:
                print line
                seq = line.split(' ',1)[-1].strip()
                print "seq: %s" % seq
                potential_barcode = seq[0:len(barcode)]
                print "something"
                if potential_barcode == barcode:
                        print "Checking sequences"
                        outseq = seq.replace(potential_barcode, "", 1)
                        outseq_length = [len(outseq)]
#                       toprocess.append("")
#                       toprocess[barcodeCounter] += outseq.strip
                        toprocess[barcodeCounter].extend(outseq.strip)   #IndexError/line40
#                       toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq.strip
                        print "outseq: %s" % outseq
                        print "Barcodes to be processed: %s" % toprocess[barcodeCounter]
                        print "BC: %i" % barcodeCounter
        handle.close()
b.close()
one = len(toprocess[0])
#two = lengths[2]
#three = lengths[3]
print one
#(av,st) = avsterr(lengths)
#print "%f +/- %f" % (av,st)

输出:

barcode: ATTAG
S01 ATTAGAAAAAAA

seq: ATTAGAAAAAAA
something
Checking sequences
Traceback (most recent call last):
  File "./FinalProject.py", line 40, in <module>
    toprocess[barcodeCounter].extend(outseq.strip)
IndexError: list index out of range

这是我基于它的代码。

sequenceCounter = -1
for line in handle:
        if line[0] == ">":
                sequenceCounter = sequenceCounter + 1
#               print "seqid %s\n" % line
                seqidList.append(line)
                seqList.append("")
        if line[0] != ">":
                seqList[sequenceCounter] = seqList[sequenceCounter] + line.strip()

编辑:添加了 enumerate 函数并注释掉了barcodeCounter的东西。

barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
#barcodeCounter = -1
for barcodeCounter, barcode in enumerate(b):
#       barcodeCounter = barcodeCounter + 1
        barcode = barcode.strip()
        print "barcode: %s" %  barcode
        handle = open(sequence, "r")
        for line in handle:
                print line
                seq = line.split(' ',1)[-1].strip()
                print "seq: %s" % seq
                potential_barcode = seq[0:len(barcode)]
                print "something"
                if potential_barcode == barcode:
                        print "Checking sequences"
                        outseq = seq.replace(potential_barcode, "", 1)
                        outseq_length = [len(outseq)]
                        toprocess.append("")
#                       toprocess[barcodeCounter] += outseq.strip
                        toprocess[barcodeCounter].append(outseq.strip) #AttributeError line 40
#                       toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq.strip
                        print "outseq: %s" % outseq
                        print "Barcodes to be processed: %s" % toprocess[barcodeCounter]
                        print "BC: %i" % barcodeCounter
        handle.close()
b.close()

新错误:

barcode: ATTAG
S01 ATTAGAAAAAAA

seq: ATTAGAAAAAAA
something
Checking sequences
Traceback (most recent call last):
  File "./FinalProject.py", line 40, in <module>
    toprocess[barcodeCounter].append(outseq.strip)
AttributeError: 'str' object has no attribute 'append'

没有问题的代码:

barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
#barcodeCounter = -1
for barcodeCounter, barcode in enumerate(b):
#       barcodeCounter = barcodeCounter + 1
        barcode = barcode.strip()
        print "barcode: \n%s\n" %  barcode
        handle = open(sequence, "r")
        for line in handle:
                print line
                seq = line.split(' ',1)[-1].strip()
                print "seq: %s" % seq
                potential_barcode = seq[0:len(barcode)]
#               print "something"
                if potential_barcode == barcode:
                        print "Checking sequences"
                        outseq = seq.replace(potential_barcode, "", 1)
                        outseq_length = [len(outseq)]
                        toprocess.append("")
                        toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq

@abarnert 你很有帮助,谢谢。有时(大部分时间)在编程方面我并不是最聪明的。我还必须更改添加新序列的方式,因为它们str不是list.

4

2 回答 2

0

你实际上有两个问题。


首先,您从 1 而不是 0 开始计数。您从 开始barcodeCounter0然后在使用它之前递增它。这意味着如果您有 3 个条形码,您将尝试设置toprocess[1], then toprocess[2], then toprocess[3],最后一个将是IndexError.

请注意,您基于它的代码开始于sequenceCounter = -1而不是0避免这个问题。

然而,这个问题还有一个更简单的解决方案:使用enumerate为你做计数:

for barcodeCounter, barcode in enumerate(b):

无需记住是从 -1、0 还是 1 开始,或者在哪里进行递增,或其中任何一个;它只是自动获取数字 0、1、2 等,直到len(b)-1.


其次,即使你算toprocess对了,大小也不一样b。事实上,它完全是空的,所以toprocess[anything]总是引发异常。

要将新值附加到 a 的末尾list,请调用该append方法:

toprocess.append(…)

再次注意,您所基于的代码总是在执行 aseqList.append("")之前执行 a seqList[sequenceCounter] =。(请注意,这有点棘手——有时它appends 和 increments sequenceCounter,有时两者都不做,并分配给seqList[sequenceCounter]使用 之前的值sequenceCounter。)你必须做同样的事情。

于 2015-04-27T07:17:43.963 回答
0

编码

listVariable[indexNumber]

专门用于访问列表变量中已经存在的内容。你给它的数字告诉 Python 你正在寻找列表的哪一部分。值得注意的是,列表从 0 开始计数,而不是 1。所以下面的代码:

list = ["a","b","c","d"]
print list[0]
print list[3]
print list[1]
print list[-1]

将导致打印

a #index 0
d #index 3
b #index 1
d #index -1

(负索引实际上是从末尾开始计算的,所以 -1 给你 d,-2 给你 c)

当您给出一个列表没有存储任何内容的数字时,会发生 indexError 。如果我尝试调用 list[4] 我会得到一个索引错误,因为它不存在,就像我尝试调用一个不存在的变量一样。

与字典不同,您不能通过提供不存在的索引来设置列表值。您需要使用 append 或 extend 之类的方法,但不是您提供索引然后调用 extend 函数的方式。严格来说

list[3].append("e")

告诉 Python 获取存储在 list[3] 中的值并在其上附加一个“e”,而不是在整个列表本身上。

list.append("e")

这就是实际上将 e 添加到我的列表中的内容。

于 2015-04-27T07:28:33.980 回答