使用循环创建列表,用float()填充它

时间:2013-11-28 08:57:16

标签: python list for-loop

我目前正在开展一个项目,要求我有一个从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:列表分配索引超出范围

有人可以帮我解决这个问题吗?

9 个答案:

答案 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]