Python-创建数字在2个值之间的列表?


355

如何创建一个包含两个输入值之间的值的列表?例如,将为11到16的值生成以下列表。

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

Answers:


643

使用range。在Python 2.x中,它返回一个列表,因此您需要做的是:

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

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

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

注意:第二个数字是唯一的。因此,这里需要为16+1=17

编辑:

要回答有关增加by的问题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]

1
太棒了!正是我想要的!还有没有一种方法可以增加较小的值,例如0.5,而不是仅增加1?所以[11.0,11.5,12.0 ...... 16.0]
lorde

2
@lorde您可以使用第三个step参数将值增加1以上,但这仍然是int -不是float。您不能在标准库中完全做到这一点。
加里德(Jared)

@Jared是否可以通过在一定间隔后删除一些值来列出列表。像[1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
非常适合讲述Python 2.x和3.x。
Sigur

如果您在不希望使用numpy的环境中工作,请考虑(其中x = 11,y = 17和step = 0.5如上所述):a_range = [x] + [x +(step * i)表示range(int)中的i ((YX)/步))]
TheLoneDeranger

23

您似乎在寻找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]

只是个小问题。在第一个代码块中,您将其list用作变量。
蛇和咖啡

2
在python中list是一个内置类,因此不鼓励将其作为变量使用
Snakes and Coffee

x *增量,但是2 *起始值是什么意思呢?你能解释一下吗?
圣淘沙桑迪

7

尝试:

range(x1,x2+1)  

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

list(range(x1,x2+1))

5

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

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]

3

在python中使用列表理解。由于您也希望列表中有16个。使用x2 + 1。范围功能不包括该功能的上限。

list = [x表示x在范围(x1,x2 + 1)中]


1
如果您range()不需要使用列表理解功能
Billal Begueradj

@BillalBegueradj在Python3中,range()返回类似于生成器的对象,而不是列表。它与Python 2中的xrange()基本相同。您是对的,不需要列表理解。名单()内置函数很容易:list(range(x1, x2+1))
Mike Housky

3

假设您希望x到y之间的范围

range(x,y+1)

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

3.x支持使用列表


2

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


0

最优雅的方法是使用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表示,最好的办法是使用rangenumpy.arrange不过,我觉得要共享的代码有趣。


list(custom_range(10,3,1))返回空列表。
Denis Rasulev

确实,就像[x for x in range(10, 3, 1)]-第一个参数是开始,第二个参数是结束,最后一个步骤。==>停止>开始
迈克尔

0

上面的每个答案都假定范围仅是正数。这是返回连续数字列表的解决方案,其中参数可以是任意值(正数或负数),并且可以设置可选的步长值(默认值= 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的评论。


1
这假设您的步骤是肯定的。
迈克尔

@Michael,好点。我已经更新了代码,所以现在您可以采取否定步骤了:)
Denis Rasulev

@tgikal,是的。但是,如果您不知道将哪些值分配给函数的参数并且需要排序返回,该怎么办?
Denis Rasulev

我看不到您的自定义函数无法使用内置范围函数完成的任何其他功能,我想改进的一个示例将是很棒的,因为您的当前示例基本上是i_min = -3, i_max = 1 any_number_range(i_max, i_min))返回的,[-3,-2,-1,0,1] 但是内置list(range(i_min, i_max + 1))将返回相同的值。
tgikal

当序列递减时,尝试使用负阶跃list(range(1,-3, -1))
Juan AntonioRoldánDíaz'19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.