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

356

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

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

Respuestas:

644

Uso 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. Por lo tanto, debe convertirlo en una lista:

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

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

EDITAR:

Para responder a la pregunta sobre el incremento 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]
Jared
fuente
1
¡Increíble! ¡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
2
@lorde Puede incrementar en más de 1 con un tercer stepparámetro, pero sigue siendo un int - no flotante. No puedes hacer eso exactamente en la lib estándar.
Jared
@ Jared, ¿puedo hacer una lista soltando algún valor después de un intervalo? como [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]
2
Bueno para contar sobre Python 2.xy 3.x.
Sigur
Si está trabajando en circunstancias en las que no se desea numpy, considere (donde x = 11, y = 17 y step = 0.5 como se indica arriba): a_range = [x] + [x + (step * i) para i en rango (int ((yx) / step))]
TheLoneDeranger
23

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 0.5lugar de 1decir:

>>> 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]
devnull
fuente
Solo un pequeño detalle. En el primer bloque de código que usa listcomo variable.
Snakes and Coffee
2
En python listes una clase integrada, por lo que se desaconseja su uso como variable
Snakes and Coffee
x * incremento, pero ¿qué quiere decir con 2 * valor inicial, para qué? ¿podrías explicar por favor?
Santosa Sandy
7

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, use:

list(range(x1,x2+1))
Mike Housky
fuente
5

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

Salida:

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]
Rajesh Surana
fuente
3

Usar la comprensión de la lista en python. Como también quieres 16 en la lista ... Usa x2 + 1. La función de rango excluye el límite superior de la función.

lista = [x para x en el rango (x1, x2 + 1)]

Bhargav Ponnapalli
fuente
1
Si range()no necesita usar una lista de comprensión
Billal Begueradj
@BillalBegueradj En Python3, range () devuelve un objeto tipo generador en lugar de una lista. Básicamente es lo mismo que xrange () en Python 2. Tienes razón en que la comprensión de la lista no es necesaria. La función incorporada lista () es más fácil: list(range(x1, x2+1)).
Mike Housky
3

suponiendo que desea tener un rango entre xay

range(x,y+1)

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

use la lista para soporte 3.x

v2b
fuente
2

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

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]

ashutosh pandey
fuente
0

La forma más elegante de hacer esto es mediante el uso de 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]

Según lo expresado anteriormente por @Jared, la mejor manera es usar rangeo, numpy.arrangesin embargo, el código me parece interesante para compartir.

Miguel
fuente
list (custom_range (10,3,1)) devuelve una lista vacía.
Denis Rasulev
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. ==> stop> start
Michael
0

Cada respuesta anterior supone que el rango es solo de números positivos. Aquí está la solución para devolver la 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.

Denis Rasulev
fuente
1
Esto supone que tu paso es positivo.
Michael
@Michael, buen punto. He actualizado el código, así que ahora puedes tener pasos negativos :)
Denis Rasulev
@tgikal, eso es correcto. Pero, ¿qué sucede si no sabe qué valores se asignarán a los argumentos de su función y necesita un retorno ordenado?
Denis Rasulev
No veo ninguna característica adicional que haga su función personalizada que no se pueda lograr usando la función de rango incorporado, supongo que un ejemplo de la mejora sería excelente, ya que su ejemplo actual es básicamente i_min = -3, i_max = 1 any_number_range(i_max, i_min))retornos [-3,-2,-1,0,1] Pero, el list(range(i_min, i_max + 1))retorno devolverá los mismos valores.
tgikal
Intenta usar un paso negativo cuando la secuencia está disminuyendolist(range(1,-3, -1))
Juan Antonio Roldán Díaz