range() with float step argument
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Python decimal range() step value
号
我希望生成如下列表:
1 | [0, 0.05, 0.1, 0.15 ... ] |
范围(0,1,0.05)会很好,但它不工作,因为:
range() integer step argument expected, got float.
号
你有什么好主意吗?;
如果你可以使用numpy,最好使用
1 2 3 4 5 | >>> 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. ]) |
。
在python 3中,range返回一个生成器(不可变序列)。所以我认为我们可以定义一个非常简单的函数,比如:
1 2 3 4 | def frange(start,stop, step=1.0): while start < stop: yield start start +=step |
所以:
1 2 | for x in frange(0, 1, 0.05): print(x) |
。
Python不需要太狡猾。
如果您需要列表,只需致电:
1 | list(frange(0,1,0.05)) |
。
或者更改函数以立即返回列表。
您可以使用一行解决方案来进行乘法运算或其他运算,但使用不同的起始值和结束值可能会很困难。如果经常使用这种范围,只需使用该函数并重用它。即使在代码上重复多次的一行程序也很糟糕。
或者这个怎么样:
1 | [v*0.05 for v in range(0,int(1/0.05))] |
号
怎么了?
1 | [i/100.0 for i in range(0, 100, 5)] |
?你检查你想要多少个数字(这里是两个),然后拿出一个合适的乘数(1变为100,0.05变为5)。
这个怎么样:
1 2 | 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 |
它不太优雅,但我从来没有费心做一个合适的功能。而且,它只在步骤大小是合理的情况下工作。优点是它足够快,可以当场完成。
有关更通用和更优雅的解决方案,请参阅对您的操作的注释。