本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Python decimal range() step value
号
我希望生成如下列表:
[0, 0.05, 0.1, 0.15 ... ]
范围(0,1,0.05)会很好,但它不工作,因为:
range() integer step argument expected, got float.
号
你有什么好主意吗?;
参见:stackoverflow.com/q/477486/1240268
stackoverflow.com/questions/477486/…
如果你可以使用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. ])
。
你赢不了:linspace可能会对有多少项目感到困惑("为什么是21而不是20?")。是的,无论如何,评论都会井然有序。
在我最初的例子未能如预期般成功之后,我将20改为21的时候,我也在想同样的事情。:)尽管如此,这种混淆比终点是否包含在范围内(以及如果不包含在范围内,如何始终包含在范围内)的混淆更不微妙,更容易发生意外。这总是一种权衡,但至少在这里,很明显你得到了你想要的——结果数组的len是21。
你总是得到你想要的。这就是编程的悲剧:)
可以指定是否应包括最后一个点。看看endpoint的论点。
在python 3中,range返回一个生成器(不可变序列)。所以我认为我们可以定义一个非常简单的函数,比如:
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))
。
或者更改函数以立即返回列表。
您可以使用一行解决方案来进行乘法运算或其他运算,但使用不同的起始值和结束值可能会很困难。如果经常使用这种范围,只需使用该函数并重用它。即使在代码上重复多次的一行程序也很糟糕。
这有点学究,但range()返回了一个列表。xrange()返回一个生成器。
不在python 3中。range返回生成器(不可变序列),xrange不再存在。我会修复打印,使其清楚地表明它是python 3。
或者这个怎么样:
[v*0.05 for v in range(0,int(1/0.05))]
号
你可能会冒险"刮掉"最后一个元素。我认为在理解上做划分更清楚。另一方面,您的方法允许选择是显式使用舍入还是截断进行范围计算,因此在某些情况下可能更好。
另外,你也可以自己计算,我只是想证明一条线是可能的。
是的,这就是为什么我+1得到了你的解决方案。但我自己做数学比较舒服,可能会在评论中解释。
@伊万科布利克,我正试图做同样的事情,但我不想生成一个列表。您将如何调整为range()中c类型的for循环所做的工作?
怎么了?
[i/100.0 for i in range(0, 100, 5)]
?你检查你想要多少个数字(这里是两个),然后拿出一个合适的乘数(1变为100,0.05变为5)。
这个怎么样:
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
它不太优雅,但我从来没有费心做一个合适的功能。而且,它只在步骤大小是合理的情况下工作。优点是它足够快,可以当场完成。
有关更通用和更优雅的解决方案,请参阅对您的操作的注释。