502

我将如何创建一个列表,其中的值介于我输入的两个值之间?例如,为从 11 到 16 的值生成以下列表:

list = [11, 12, 13, 14, 15, 16]
4

12 回答 12

893

使用range. 在 Python 2.x 中,它返回一个列表,所以您只需要:

>>> range(11, 17)
[11, 12, 13, 14, 15, 16]

在 Python 3.xrange中是一个迭代器。因此,您需要将其转换为列表:

>>> list(range(11, 17))
[11, 12, 13, 14, 15, 16]

注意:第二个数字是排他的。所以,这里需要16+1=17

编辑:

要回答关于递增的问题0.5,最简单的选择可能是使用numpy 的 arange().tolist()

>>> import numpy as np
>>> np.arange(11, 17, 0.5).tolist()

[11.0, 11.5, 12.0, 12.5, 13.0, 13.5,
 14.0, 14.5, 15.0, 15.5, 16.0, 16.5]
于 2013-08-16T04:47:21.710 回答
39

您似乎正在寻找range()

>>> x1=11
>>> x2=16
>>> range(x1, x2+1)
[11, 12, 13, 14, 15, 16]
>>> list1 = range(x1, x2+1)
>>> list1
[11, 12, 13, 14, 15, 16]

对于增加0.5而不是1,说:

>>> list2 = [x*0.5 for x in range(2*x1, 2*x2+1)]
>>> list2
[11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0]
于 2013-08-16T04:46:44.027 回答
12

尝试:

range(x1, x2+1)  

这是 Python 2.x 中的列表,其行为与 Python 3.x 中的列表非常相似。如果您正在运行 Python 3 并且需要一个可以修改的列表,请使用:

list(range(x1, x2+1))
于 2013-08-16T04:49:50.580 回答
6

在 python 中使用列表推导。由于您也希望列表中有 16 个.. 使用 x2+1。范围函数不包括函数中的上限。

list=[x for x in range(x1, x2+1)]
于 2013-08-16T04:46:59.800 回答
6

假设您希望在 x 到 y 之间有一个范围

range(x,y+1)

>>> range(11,17)
[11, 12, 13, 14, 15, 16]
>>>

3.x 支持的使用列表

于 2013-08-16T04:47:58.733 回答
6

如果您正在寻找适用于浮点类型的类似范围的函数,那么这是一篇非常好的文章

def frange(start, stop, step=1.0):
    ''' "range()" like function which accept float type''' 
    i = start
    while i < stop:
        yield i
        i += step
# Generate one element at a time.
# Preferred when you don't need all generated elements at the same time. 
# This will save memory.
for i in frange(1.0, 2.0, 0.5):
    print i   # Use generated element.
# Generate all elements at once.
# Preferred when generated list ought to be small.
print list(frange(1.0, 10.0, 0.5))    

输出:

1.0
1.5
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5]
于 2016-03-15T03:21:36.027 回答
5

在 python 中,你可以很容易地做到这一点

start=0
end=10
arr=list(range(start,end+1))
output: arr=[0,1,2,3,4,5,6,7,8,9,10]

或者您可以创建一个递归函数,该函数返回一个给定数字的数组:

ar=[]
def diff(start,end):
    if start==end:
        d.append(end)
        return ar
    else:
        ar.append(end)
        return diff(start-1,end) 

输出:ar=[10,9,8,7,6,5,4,3,2,1,0]

于 2019-06-04T19:01:04.947 回答
4

我来到这里是因为我想使用列表理解以 0.1 的增量创建一个介于 -10 和 10 之间的范围。而不是像上面大多数答案那样做一个过于复杂的功能,我只是这样做了

simple_range = [ x*0.1 for x in range(-100, 100) ]

通过将范围计数更改为 100,我现在可以使用标准范围函数获得 -10 到 10 的范围。所以如果你需要它 0.2 那么就做 range(-200, 200) 等等

于 2020-08-03T21:25:27.443 回答
3

上面的每个答案都假设范围仅是正数。这是返回连续数字列表的解决方案,其中参数可以是任何(正或负),并且可以设置可选的步长值(默认值 = 1)。

def any_number_range(a,b,s=1):
""" Generate consecutive values list between two numbers with optional step (default=1)."""
if (a == b):
    return a
else:
    mx = max(a,b)
    mn = min(a,b)
    result = []
    # inclusive upper limit. If not needed, delete '+1' in the line below
    while(mn < mx + 1):
        # if step is positive we go from min to max
        if s > 0:
            result.append(mn)
            mn += s
        # if step is negative we go from max to min
        if s < 0:
            result.append(mx)
            mx += s
    return result

例如,标准命令list(range(1,-3))返回空列表[],而此函数将返回[-3,-2,-1,0,1]

更新:现在步骤可能是负面的。感谢@Michael 的评论。

于 2017-12-04T15:42:27.033 回答
3

最优雅的方法是使用该range函数,但是如果您想重新创建此逻辑,您可以执行以下操作:

def custom_range(*args):
    s = slice(*args)
    start, stop, step = s.start, s.stop, s.step
    if 0 == step:
        raise ValueError("range() arg 3 must not be zero")
    i = start
    while i < stop if step > 0 else i > stop:
        yield i
        i += step

>>> [x for x in custom_range(10, 3, -1)]

这将产生输出:

[10, 9, 8, 7, 6, 5, 4]

正如@Jared 之前所说,最好的方法是使用,range或者numpy.arrange我发现共享代码很有趣。

于 2018-01-11T11:22:39.487 回答
3

虽然@Jared 的增量答案适用于0.5步长,但由于舍入问题,它对于其他步长失败:

np.arange(11, 17, 0.1).tolist()
# [11.0,11.1,11.2,11.299999999999999, ...   16.79999999999998, 16.899999999999977]

相反,我自己需要这样的东西,而不仅仅是为了0.5

# Example 11->16 step 0.5
s = 11
e = 16
step = 0.5
my_list = [round(num, 2) for num in np.linspace(s,e,(e-s)*int(1/step)+1).tolist()]
# [11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0]

# Example 0->1 step 0.1
s = 0
e = 1
step = 0.1
my_list = [round(num, 2) for num in np.linspace(s,e,(e-s)*int(1/step)+1).tolist()]
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
于 2020-06-18T13:50:55.040 回答
0

@YTZ 的回答对我来说效果很好。我必须生成一个从 0 到 10000 的列表,步长为 0.01,并且由于舍入问题,在每次迭代中简单地添加 0.01 不起作用。

因此,我使用了@YTZ 的建议并编写了以下函数:

import numpy as np


def generate_floating_numbers_in_range(start: int, end: int, step: float):
    """
    Generate a list of floating numbers within a specified range.

    :param start: range start
    :param end: range end
    :param step: range step
    :return:
    """
    numbers = np.linspace(start, end,(end-start)*int(1/step)+1).tolist()
    return [round(num, 2) for num in numbers]
于 2021-10-01T13:13:58.930 回答