IndexError: list index out of range, not sure why
IndexError: list index out of range, not sure why
我希望程序做的是获取与某个条形码相关的序列并执行定义的函数(序列的平均长度和标准偏差,减去条形码和不相关的 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()
编辑:
添加了枚举函数并注释掉了 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
.
其实你这里有两个问题。
首先,您是从 1 而不是 0 开始计数。您从 barcodeCounter
开始 0
,然后在使用它之前递增它。这意味着如果你有,比如说,3 个条形码,你试图设置 toprocess[1]
,然后是 toprocess[2]
,然后是 toprocess[3]
,最后一个将是 [=17] =].
请注意,您基于它的代码以 sequenceCounter = -1
而不是 0
开头,以避免出现此问题。
但是,有一个更简单的解决方法:使用 enumerate
为您计数:
for barcodeCounter, barcode in enumerate(b):
无需记住是从 -1、0 还是 1 开始,或者从哪里开始递增,等等;它只是自动获取数字 0、1、2 等,直到 len(b)-1
.
其次,即使您数对了,toprocess
也与 b
大小不同。事实上,它完全是空的,所以 toprocess[anything]
总是 会引发异常。
要将新值附加到 list
的末尾,您可以调用 append
方法:
toprocess.append(…)
再次注意,您所基于的代码总是在执行 seqList[sequenceCounter] =
之前执行 seqList.append("")
。 (请注意,这有点棘手——有时它 append
并递增 sequenceCounter
,有时两者都不做,并使用 sequenceCounter
的先前值分配给 seqList[sequenceCounter]
。)你必须做同样的事情。
代码
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 这样的方法,但不是您在提供索引然后调用扩展函数时使用的方法。严格来说
list[3].append("e")
告诉 Python 获取列表 [3] 中存储的值并向其附加 'e',而不是整个列表本身。
list.append("e")
这就是实际将 e 添加到我的列表中的原因。
我希望程序做的是获取与某个条形码相关的序列并执行定义的函数(序列的平均长度和标准偏差,减去条形码和不相关的 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()
编辑: 添加了枚举函数并注释掉了 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
.
其实你这里有两个问题。
首先,您是从 1 而不是 0 开始计数。您从 barcodeCounter
开始 0
,然后在使用它之前递增它。这意味着如果你有,比如说,3 个条形码,你试图设置 toprocess[1]
,然后是 toprocess[2]
,然后是 toprocess[3]
,最后一个将是 [=17] =].
请注意,您基于它的代码以 sequenceCounter = -1
而不是 0
开头,以避免出现此问题。
但是,有一个更简单的解决方法:使用 enumerate
为您计数:
for barcodeCounter, barcode in enumerate(b):
无需记住是从 -1、0 还是 1 开始,或者从哪里开始递增,等等;它只是自动获取数字 0、1、2 等,直到 len(b)-1
.
其次,即使您数对了,toprocess
也与 b
大小不同。事实上,它完全是空的,所以 toprocess[anything]
总是 会引发异常。
要将新值附加到 list
的末尾,您可以调用 append
方法:
toprocess.append(…)
再次注意,您所基于的代码总是在执行 seqList[sequenceCounter] =
之前执行 seqList.append("")
。 (请注意,这有点棘手——有时它 append
并递增 sequenceCounter
,有时两者都不做,并使用 sequenceCounter
的先前值分配给 seqList[sequenceCounter]
。)你必须做同样的事情。
代码
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 这样的方法,但不是您在提供索引然后调用扩展函数时使用的方法。严格来说
list[3].append("e")
告诉 Python 获取列表 [3] 中存储的值并向其附加 'e',而不是整个列表本身。
list.append("e")
这就是实际将 e 添加到我的列表中的原因。