2012-09-13 50 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