在Python中生成一定范围内等间距数字的列表

65

如何用Pythonic的方式创建一个长度任意的列表,其中包含在给定范围内等间距分布的数字(不仅仅是整数)?举个例子:

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

看起来太复杂了。有什么想法吗?


有一些不错的解决方案:https://dev59.com/oHRB5IYBdhLWcg3w4bKv - Pill
1
请注意,由于浮点数的(必要)不准确性,此方法仅对某些序列有效。 - user395760
7个回答

93

如果你有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])

14
@Double AA:正确的;如果你需要一个列表,你可以使用np.linspace(0,5,10).tolist() - unutbu

53
您可以使用以下方法:
[lower + x*(upper-lower)/length for x in range(length)]

这种方法要求lower和/或upper必须被赋值为浮点数才能起作用。


9
如果numpy不可用,有一个简洁的Python备选方案是很好的。 - feedMe
6
这个更新后的版本会产生与NumPy linspace完全相同的输出: [lower + x*(upper-lower)/(length-1) for x in range(length)。 (注:该代码用于生成一段等间隔的数值序列,其中 lower 为下限,upper 为上限,length 为序列长度。) - Trav
@Trav并没有提供完全相同的结果。当升序linspace和降序linspace时,结果在数值上并不相同(例如:np.linspace(1,0.2,4))。尽管如此,这仍然是一个很好的努力,可以得到大致相同的数字(对于升序情况)。 - Stefan Karlsson

14

与unutbu的答案类似,您可以使用numpy的arange函数,它类似于Python内置函数range。请注意,终点不包括在内,就像range一样:

>>> import numpy as np
>>> a = np.arange(0,5, 0.5)
>>> a
array([ 0. ,  0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5])
>>> a = np.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]

或者简单地说: a = N.arange(0, 5, 0.5).tolist() - nvd
3
使用numpy.arange()时要小心,因为端点的处理不一致会导致不可靠的行为。详见这里 - lhcgeneva
对于整数,np.arange(0, 5, 1)。对于浮点数,np.arange(0, 5, 1.0)。 - Bandham Manikanta

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

会是一种实现的方式。

2
Numpy的便利函数r_也可以使用语法np.r_[start:stop:steps]创建均匀间隔的列表。如果steps是实数(以j结尾),则终点被包括在内,相当于np.linspace(start, stop, step, endpoint=1),否则不包括。最初的回答。
>>> np.r_[-1:1:6j, [0]*3, 5, 6]
array([-1. , -0.6, -0.2,  0.2,  0.6,  1.])

您可以直接连接其他数组和标量:

您还可以直接连接其他数组和标量:

最初的回答
>>> np.r_[-1:1:6j, [0]*3, 5, 6]
array([-1. , -0.6, -0.2,  0.2,  0.6,  1. ,  0. ,  0. ,  0. ,  5. ,  6. ])

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

0

跟 Howard 的答案类似,但更有效率一些:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接