Python: ¿crear una lista con números entre 2 valores?

469

¿Cómo crearía una lista con valores entre dos valores que puse? Por ejemplo, la siguiente lista se genera para los valores del 11 al 16:

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

Utilice range. En Python 2.x devuelve una lista, por lo que todo lo que necesita es:

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

En Python 3.x rangees un iterador. Entonces, necesitas convertirlo en una lista:

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

Nota : El segundo número es exclusivo. Entonces, aquí debe ser 16+1=17

EDITAR:

Para responder a la pregunta sobre incrementar en 0.5, la opción más fácil probablemente sería usar numpy's arange() y .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]
8
  • 2
    ¡Impresionante! ¡Exactamente lo que estaba buscando! ¿Existe también una forma de incrementar en valores más pequeños como 0.5 que solo 1? entonces [11.0, 11.5, 12.0 ...... 16.0]lorde 16 de agosto de 2013 a las 4:50
  • 4
    @lorde Puede incrementar en más de 1 con un tercer stepparámetro, pero sigue siendo un int, no flotante. No puede hacer eso exactamente en la biblioteca estándar. Jared 16 de agosto de 2013 a las 4:53
  • @Jared, ¿puedo hacer una lista dejando caer algún valor después de un intervalo? como [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]user6390698 7 de junio de 2016 a las 9:12
  • 2
    Bueno para hablar sobre Python 2.xy 3.x. Sigur 15/04/2017 a las 16:24
  • Si está trabajando en circunstancias en las que numpy no es deseado, considere (donde x = 11, y = 17 y step = 0.5 como arriba): a_range = [x] + [x + (step * i) for i in range (int ((yx) / paso))]TheLoneDeranger 3 oct 2018 a las 17:53
30

Pareces estar buscando 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]

Para incrementar en en 0.5lugar de 1, diga:

>>> 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]
3
  • 1
    Solo un pequeño detalle. En el primer bloque de código se usa listcomo variable. Snakes and Coffee 16 de agosto de 2013 a las 5:17
  • 2
    En Python listes una clase incorporada, por lo que su uso como variable está algo desaconsejadoSnakes and Coffee 16 de agosto de 2013 a las 5:33
  • x * incremento, pero ¿qué quieres decir con 2 * valor inicial, para qué? ¿Podrías explicarme por favor? Santosa Sandy 27 mar 2017 a las 7:30
10

Tratar:

range(x1,x2+1)  

Esa es una lista en Python 2.xy se comporta principalmente como una lista en Python 3.x. Si está ejecutando Python 3 y necesita una lista que pueda modificar, utilice:

list(range(x1,x2+1))
6

Si está buscando una función de rango que funcione para el tipo flotante, aquí hay un muy buen artículo .

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

Producción:

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]
1
  • ¿Por qué no el one-liner en su lugar? start = 2; step =1; end = 10; z= np.array(range(start*step,step*end))/step; print(z)Mohd 11/11/20 a las 10:02
5

Utilice la comprensión de listas en Python. Ya que también quieres 16 en la lista ... Usa x2 + 1. La función de rango excluye el límite superior de la función.

list=[x for x in range(x1,x2+1)]

2
  • 2
    Si range()no necesita usar una lista de comprensiónBillal Begueradj 17/04/18 a las 10:59
  • @BillalBegueradj En Python3, range () devuelve un objeto similar a un generador en lugar de una lista. Es básicamente lo mismo que xrange () en Python 2. Tienes razón en que no se necesita comprensión de listas. La función incorporada lista () es más fácil: list(range(x1, x2+1)). Mike Housky 19 de ene. De 2020 a las 5:14
5

asumiendo que quiere tener un rango entre xay

range(x,y+1)

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

lista de uso para compatibilidad con 3.x

4

En Python puedes hacer esto muy fácilmente

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

o puede crear una función recursiva que devuelva una matriz hasta un número determinado:

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

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

3

Cada respuesta anterior asume que el rango es solo de números positivos. Aquí está la solución para devolver una lista de números consecutivos donde los argumentos pueden ser cualquiera (positivo o negativo), con la posibilidad de establecer un valor de paso opcional (predeterminado = 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

Por ejemplo, el comando estándar list(range(1,-3))devuelve una lista vacía [], mientras que esta función devolverá[-3,-2,-1,0,1]

Actualizado : ahora el paso puede ser negativo. Gracias @Michael por su comentario.

5
  • 1
    Esto supone que su paso es positivo. Michael 10 de ene. De 2018 a las 13:55
  • @Michael, buen punto. Actualicé el código, así que ahora puedes tener pasos negativos :)Denis Rasulev 11/01/18 a las 11:11
  • @tgikal, eso es correcto. Pero, ¿qué pasa si no sabe qué valores se asignarán a los argumentos de su función y necesita un retorno ordenado? Denis Rasulev 6 de septiembre de 2018 a las 6:15
  • No veo ninguna característica adicional que haga su función personalizada que no se pueda lograr usando la función de rango incorporada, supongo que un ejemplo de la mejora sería genial, ya que su ejemplo actual es básicamente i_min = -3, i_max = 1 any_number_range(i_max, i_min))devoluciones [-3,-2,-1,0,1] Pero, incorporado list(range(i_min, i_max + 1))devolverá los mismos valores. tgikal 6 de septiembre de 2018 a las 20:43
  • Intente usar un paso negativo cuando la secuencia sea decrecientelist(range(1,-3, -1))Juan Antonio Roldán Díaz 17/07/19 a las 8:04
3

Llegué aquí porque quería crear un rango entre -10 y 10 en incrementos de 0.1 usando la comprensión de listas. En lugar de hacer una función demasiado complicada como la mayoría de las respuestas anteriores, acabo de hacer esto

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

Al cambiar el recuento del rango a 100, ahora obtengo mi rango de -10 a 10 usando la función de rango estándar. Entonces, si lo necesita en 0.2, simplemente haga un rango (-200, 200) y así sucesivamente, etc.

2

La forma más elegante de hacer esto es usando la rangefunción, sin embargo, si desea volver a crear esta lógica, puede hacer algo como esto:

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

Esto produce la salida:

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

Como lo expresó antes @Jared, la mejor manera es usar el rangeo numpy.arrangecomo me parezca interesante compartir el código.

2
  • list (rango_personalizado (10,3,1)) devuelve una lista vacía. Denis Rasulev 11/01/18 a las 11:33
  • de hecho, como [x for x in range(10, 3, 1)]- el primer argumento es el comienzo, el segundo el final y el último el paso. ==> detener> iniciarMichael 11/01/18 a las 11:37
2

Si bien la respuesta de @ Jared para incrementar funciona para el 0.5tamaño de paso, falla para otros tamaños de paso debido a problemas de redondeo:

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

En cambio, necesitaba algo como esto yo mismo, trabajando no solo para 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]