8

可能重复:
Python 十进制范围()步长值

我想生成这样的列表:

[0, 0.05, 0.1, 0.15 ... ]

range(0, 1, 0.05)会很棒,但它不起作用,因为:

预期范围()整数步长参数,得到浮点数。

你有什么优雅的想法吗?;)

4

5 回答 5

6

如果可以使用 numpy,最好使用numpy.linspace. 尝试range在浮点数上拟合逻辑的函数,包括 numpy 自己的函数arange,通常会在结束边界是否在列表中结束时感到困惑。linspace通过让您明确指定起点、终点和所需的元素数量,优雅地解决了这个问题:

>>> import numpy
>>> numpy.linspace(0.0, 1.0, 21)
array([ 0.  ,  0.05,  0.1 ,  0.15,  0.2 ,  0.25,  0.3 ,  0.35,  0.4 ,
        0.45,  0.5 ,  0.55,  0.6 ,  0.65,  0.7 ,  0.75,  0.8 ,  0.85,
        0.9 ,  0.95,  1.  ])
于 2012-09-13T09:51:41.117 回答
5

在 Python 3 中,范围返回一个生成器(不可变序列)......所以我认为我们可以定义一个非常简单的函数,例如:

def frange(start,stop, step=1.0):
    while start < stop:
        yield start
        start +=step

所以:

for x in frange(0, 1, 0.05):
   print(x)

Python 不需要很棘手。

如果你想要一个列表,只需调用:

list(frange(0,1,0.05))

或者更改函数以立即返回列表。

您可以使用一条线的解决方案来相乘或做其他事情,但使用不同的开始和结束值可能会很棘手。如果您经常使用这种范围,只需使用该功能并重用它。即使是在代码上重复多次的单行代码也是不好的。

于 2012-09-13T11:02:31.167 回答
3

或者这个怎​​么样:

[v*0.05 for v in range(0,int(1/0.05))]
于 2012-09-13T09:46:34.740 回答
1

这个怎么样:

temp = range(0,100,5) # 0,5,10,...,95
final_list = map(lambda x: x/100.0,temp) # becomes 0,0.05,0.10,...,0.95

它不是很优雅,但我从来没有费心去做一个合适的功能。此外,它仅在步长合理的情况下才有效。优点是速度足够快,可以在现场完成。

请参阅对您的 OP 的评论以获得更通用和更优雅的解决方案。

于 2012-09-13T09:43:43.790 回答
1

有什么问题

[i/100.0 for i in range(0, 100, 5)]

? 你检查你想要多少位数(这里是两个)并找出一个合适的乘数(1 变成 100,0.05 变成 5)。

于 2012-09-13T09:49:55.703 回答