2012-09-13 57 views
5

可能重复:
Python decimal range() step value范围()与浮动步骤参数

我想生成列表是这样的:

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

范围(0,1, 0.05)会很好,但它不起作用:

range()整数步参数预计,得到浮动。

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

+8

请参阅:http://stackoverflow.com/q/477486/1240268 –

+1

http://stackoverflow.com/questions/477486/python-decimal-range-step-value –

回答

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的意见,以获得更一般和更优雅的解决方案。

2

或者这个怎​​么样:

[v*0.05 for v in range(0,int(1/0.05))] 
+0

您有风险去'刮'最后元素,也许。我认为理解中的分工更清晰。另一方面,您的方法允许选择是否明确使用舍入或截断计算范围,所以在某些情况下可能会更好。 – LSerni

+0

另外,你可以自己做数学'[v * 0.05 for v in range(0,20)]',我只是试图表明一个班轮是可能的:) –

+1

是的,这就是为什么我为你的解决方案+1了。但我更喜欢自己做数学,并可能在评论中解释。 – LSerni

1

这有什么错

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

?你可以检查你想要的数字(这里是两个),并选出一个合适的乘数(1变成100,0.05变成5)。

5

如果您可以使用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. ]) 
+0

你不能赢:'linspace'可能会让人困惑*有多少物品*(“为什么21而不是20?”)。无论如何,评论总是有序的。 – LSerni

+0

在我最初的例子没有像预期的那样工作之后,当我将'20'更改为'21'时,我正在考虑完全相同的事情。 :)尽管如此,这种混淆与其说是混淆了终点是否包含在范围内(以及如果不包含在范围内总是如此),这种混淆并不那么微妙,并且容易出现意外。这总是一种折衷,但至少在这里很明显,你得到了你所要求的 - 结果数组*的“len”是* 21. – user4815162342

+0

你*总是*得到你所要求的。这是编程的悲剧:) – LSerni

3

在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)) 

或更改函数返回一个列表的时候了。

您可以使用一行解决方案来实现乘法或其他操作,但对于不同的起始值和结束值可能会非常棘手。如果您经常使用这种范围,只需使用该功能并重新使用即可。甚至在代码上多次重复一行也很糟糕。

+0

这是一种迂腐,但'range()'返回一个列表。 'xrange()'返回一个生成器。 – helper

+0

不在Python 3中。范围返回一个生成器(不可变序列),并且xrange不再存在。我会修复打印,以清楚它是python 3。 – nmenezes