我目前正在开展一个项目,要求我有一个从0.9到1.2的列表,步长为0.01。我尝试了以下方法:
init = float(0.9)
l = []
for i in range(0,31):
l[i]= init + ( float(i) / 100 )
然而,python给了我以下输出:
回溯(最近一次呼叫最后):文件“”,第2行,in IndexError:列表分配索引超出范围
有人可以帮我解决这个问题吗?
答案 0 :(得分:9)
[]
仅在列表中此索引处已存在元素时才起作用。使用list.append():
init = float(0.9)
l = []
for i in range(0,31):
l.append(init + ( float(i) / 100 ))
一旦您对此感到满意,您甚至可以使用理解列表:
l = [init + (float(i) / 100 )) for i in range(0, 31)]
Python中很少使用索引。我理解很多人这样做是因为它是其他语言的习惯,但大多数时候,它是Python中的反模式。如果你在某个地方看到i
,总是想知道你是不是想重新发明轮子。
顺便说一句。分部优先考虑加法,因此不需要括号。另外,init = float(0.9)
是多余的。你可以写init = 0.9
。并且/
总是返回一个浮点数,因此你可以这样做:
l = []
for i in range(0, 31):
l.append(0.9 + i / 100)
还要注意我放置空间的方式。这是most used style convention in Python。
并且有一个理解列表:
l = [0.9 + i / 100 for i in range(0, 31)]
这是一种更简单的方式来实现你想要的。不要担心,如果您的代码有效并且您理解它,那么它是最重要的。你不需要这样做。我只是给你这些信息,以便你可以在以后使用它。
答案 1 :(得分:3)
您需要扩展列表。使用:
l.append(init + (float(i)/100))
或
l += [init + (float(i)/100)]
甚至是更加pythonic的方式
l = [init + (float(i)/100) for i in range(0, 31)]
答案 2 :(得分:3)
使用itertools模块:
In [8]: for i in itertools.count(0.9, 0.01):
...: print i
...: if i > 1.2:
...: break
...:
0.9
0.91
0.92
0.93
.
.
.
1.18
1.19
1.2
正如评论中所指出的,count()
可以与takewhile结合使用,以便创建列表理解:
[i for i in itertools.takewhile(lambda x: x <= 1.2, itertools.count(0.9, 0.01))]
答案 3 :(得分:0)
您无法将值分配给不存在的索引列表:
>>> abc = []
>>> abc[0] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
使用append
,它会将值附加到列表中,即将其分配给下一个索引。
或者这也可以使用列表理解轻松完成:
>>> [ round(float(0.9) + (float(i) / 100 ),2) for i in range(0,31)]
[0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2]
注意:我使用round来舍入一切最多2位小数。如果您不需要,可以删除该部分。
答案 4 :(得分:0)
除非我忽视某些事情,否则你可以通过列表理解来实现这一点:
init = float(0.9)
l = [init + (float(i) / 100) for i in range(31)]
无论您最终使用哪种解决方案,都应考虑浮点错误,并且可能使用decimal.Decimal
类而不是浮点数。我用浮点测试的所有解决方案都产生了舍入误差,例如:
>>> l
[0.9, 0.91, 0.92, 0.93, 0.9400000000000001, ...]
答案 5 :(得分:0)
考虑使用l.append()将值附加到列表中,如下所示:
init = float(0.9)
l = []
for i in range(0,31):
a = init + (float(i)/100)
l.append(a)
编辑:还有另一种方法可以做到这一点,不使用任何列表函数和随机函数(虽然以前的方法可能更容易)。基本上,您只需创建一个随机列表,然后使用所需的值替换列表中的值。看看:
import random
init = float(0.9)
l = [random.random() for i in range(0,31)]
for i in range(0,31):
l[i]= init + ( float(i) / 100 )
print l
它也应该以这种方式工作。但是,这只是在您不想使用任何列表函数时。不过,第一个脚本更容易,可能更好。
答案 6 :(得分:0)
关于.append()
您已被告知。
但还有另外一点:由于.01
无法完全以浮点数表示,因此继续添加.01
将总结此错误。
更准确的是
init = float(0.9)
end = float(1.21)
steps = 31
l = []
for i in range(0,31):
l.append((init * (steps - i) + end * i) / steps)
答案 7 :(得分:0)
试试这个:
init = float(0.9)
l = [init + ( float(i) / 100 ) for i in range(0,31)]
它会起作用:))
答案 8 :(得分:0)
每个人都给出了很好的答案 但是我想为什么不能解决这个问题的一般功能 即不事先知道范围(在这种情况下范围是0-31)
>>> l=[]
>>> def addNumFun(startRange, endRange, interval):
init = str(interval)[::-1].find('.')
start = int(startRange * (10**init))
end = int(endRange * (10**init))
for i in range(start,end):
l.append(i/(10**init))
l.append(end/(10**init)) # to add the last number of range
>>> addNumFun(0.9,1.2,0.01)
>>> l
[0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2]