2011-07-13 43 views
23

Cách tạo danh sách chiều dài tùy ý có chứa các số cách đều nhau (không chỉ toàn bộ số nguyên) giữa các giới hạn nhất định? Ví dụ:Tạo một danh sách các số khoảng cách đều nhau trong một phạm vi nhất định trong 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 ] 

Lưu ý hàm Range() chỉ giao dịch với số nguyên. Và điều này:

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 

có vẻ quá phức tạp. Bất kỳ ý tưởng?

+0

Có một số giải pháp tốt đẹp: http://stackoverflow.com/questions/477486/python-decimal-range-step-value – Pill

+1

Lưu ý rằng điều này chỉ hoạt động chính xác đối với một số chuỗi do sự thiếu chính xác (cần thiết) của các số dấu phẩy động. – delnan

Trả lời

40

Với NumPy, bạn có thể sử dụng linspace:

Bao gồm các thiết bị đầu cuối bên phải (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.  ]) 

Loại trừ điểm cuối bên phải:

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

Để công bằng, điều này sẽ mang lại cho bạn một mảng không phải là một danh sách ... –

+5

@ Double AA: True; nếu bạn cần một danh sách, bạn có thể sử dụng 'np.linspace (0,5,10) .tolist()'. – unutbu

23

Bạn có thể sử dụng phương pháp sau đây:

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

thấp và/hoặc trên phải được chỉ định như nổi cho phương pháp này để làm việc.

+3

Rất vui khi có một lựa chọn thay thế python cổ phiếu ngắn gọn trong trường hợp không có sẵn. – feedMe

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

sẽ là một cách để làm điều đó.

0

Tương tự như câu trả lời Howard nhưng hiệu quả hơn một chút:

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

Tương tự như câu trả lời của unutbu, bạn có thể sử dụng hàm arange của numpy, tương tự với phạm vi hàm nội tại của python. Chú ý rằng điểm cuối không được bao gồm, như trong khoảng:

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

Hoặc đơn giản là: a = N.arange (0, 5, 0.5) .tolist() – nvd

+2

Cẩn thận khi sử dụng numpy.arange(), mặc dù, điểm cuối không được xử lý nhất quán, dẫn đến hành vi không đáng tin cậy, xem [tại đây] (http://quantumwise.com/forum/index.php?topic=110.0). – lhcgeneva

1

Bạn có thể sử dụng mã folowing:

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)] 
Các vấn đề liên quan