2011-07-13 195 views
23

什麼是在給定範圍之間製作包含均勻間隔數字(而不僅僅是整數)的任意長度列表的pythonic方法?例如:在python中製作一定範圍內的均勻間隔數字的列表

my_func(0,5,10) # (lower_bound , upper_bound , length) 
# [ 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5 ] 

注意Range()函數只處理整數。而這個:

def my_func(low,up,leng): 
    list = [] 
    step = (up - low)/float(leng) 
    for i in range(leng): 
     list.append(low) 
     low = low + step 
    return list 

好像太複雜了。有任何想法嗎?

+0

有一些很好的解決方案:http://stackoverflow.com/questions/477486/python-decimal-range-step-value – Pill

+1

請注意,由於浮點數的(必要的)不準確性,這隻適用於某些序列。 – delnan

回答

40

鑑於numpy的,你可以使用linspace

包括正確的端點(5):

In [46]: import numpy as np 
In [47]: np.linspace(0,5,10) 
Out[47]: 
array([ 0.  , 0.55555556, 1.11111111, 1.66666667, 2.22222222, 
     2.77777778, 3.33333333, 3.88888889, 4.44444444, 5.  ]) 

撇除右端點:

In [48]: np.linspace(0,5,10,endpoint=False) 
Out[48]: array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]) 
+2

公平,這給你一個numpy陣列不列表... –

+5

@雙AA:真;如果你需要一個列表,你可以使用'np.linspace(0,5,10).tolist()'。 – unutbu

23

您可以用下面的辦法:

[lower + x*(upper-lower)/length for x in range(length)] 

下和/或上必須被指定爲花車這種方法工作。

+3

如果numpy不可用,很高興有一個簡潔的股票python備選方案。 – feedMe

1
f = 0.5 
a = 0 
b = 9 
d = [x * f for x in range(a, b)] 

將是一種方式來做到這一點。

0

霍華德的答案,但更多的高效類似:

def my_func(low, up, leng): 
    step = ((up-low) * 1.0/leng) 
    return [low+i*step for i in xrange(leng)] 
4

與unutbu的答案類似,您可以使用numpy的arange函數,它類似於python的內部函數範圍。請注意,不包括端點,如範圍:

>>> import numpy as N 
>>> a=N.arange(0,5,0.5) 
>>> a 
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]) 
>>> import numpy as N 
>>> a=N.arange(0,5,0.5) # returns a numpy array 
>>> a 
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]) 
>>> a.tolist() # if you prefer it as a list 
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5] 
+0

或簡單地說: a = N.arange(0,5,0.5).tolist() – nvd

+2

但是,使用numpy.arange()時要小心,但端點不能一致處理,會導致不可靠的行爲,請參見[here]( http://quantumwise.com/forum/index.php?topic=110.0)。 – lhcgeneva

1

您可以使用如下因素代碼:

def float_range(initVal, itemCount, step): 
    for x in xrange(itemCount): 
     yield initVal 
     initVal += step 

[x for x in float_range(1, 3, 0.1)]