Python - Crea un elenco con numeri tra 2 valori?


356

Come potrei creare un elenco con valori tra due valori che ho inserito? Ad esempio, il seguente elenco viene generato per i valori da 11 a 16:

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

Risposte:


644

Usa range. In Python 2.x restituisce un elenco, quindi tutto ciò che serve è:

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

In Python 3.x rangeè un iteratore. Quindi, è necessario convertirlo in un elenco:

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

Nota : il secondo numero è esclusivo. Quindi, qui deve essere 16+1=17

MODIFICARE:

Per rispondere alla domanda sull'incremento di0.5 , l'opzione più semplice sarebbe probabilmente usare numpy arange() e .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
Eccezionale! Esattamente quello che stavo cercando! C'è anche un modo per incrementare di valori più piccoli come 0,5 rispetto a solo 1? quindi [11.0, 11.5, 12.0 ...... 16.0]
lorde

2
@lorde Puoi incrementare di più di 1 con un terzo stepparametro ma è comunque un int - non float. Non puoi farlo esattamente nella lib standard.
Jared,

@Jared posso fare un elenco facendo cadere un valore dopo un certo intervallo. come [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
Buono per parlare di Python 2.xe 3.x.
Sigur,

Se lavori in circostanze in cui numpy è indesiderato, considera (dove x = 11, y = 17 e step = 0,5 come sopra): a_range = [x] + [x + (step * i) per i nell'intervallo (int ((yx) / step))]
TheLoneDeranger

23

Sembra che tu stia cercando 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]

Per incrementare di 0.5invece di 1, dire:

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

Solo un piccolo pignolo. Nel primo blocco di codice si utilizza listcome variabile.
Snakes and Coffee

2
In python listè una classe integrata, quindi il suo utilizzo come variabile è un po 'scoraggiato
Snakes and Coffee

x * incremento, ma cosa intendi per 2 * valore iniziale, per cosa? spiegheresti per favore?
Santosa Sandy,

7

Provare:

range(x1,x2+1)  

Questa è una lista in Python 2.x e si comporta principalmente come una lista in Python 3.x. Se stai eseguendo Python 3 e hai bisogno di un elenco che puoi modificare, usa:

list(range(x1,x2+1))

5

Se stai cercando una funzione come range che funzioni per il tipo float, allora ecco un ottimo articolo .

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

Produzione:

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

Usa la comprensione dell'elenco in Python. Dato che ne vuoi anche 16 nell'elenco ... Usa x2 + 1. La funzione di intervallo esclude il limite superiore nella funzione.

list = [x per x nell'intervallo (x1, x2 + 1)]


1
Se non hai range()bisogno di usare una comprensione dell'elenco
Billal Begueradj,

@BillalBegueradj In Python3, range () restituisce un oggetto simile a un generatore anziché un elenco. È praticamente lo stesso di xrange () in Python 2. Hai ragione nel capire che l'elenco non è necessario. La funzione built-list () è più facile: list(range(x1, x2+1)).
Mike Housky il

3

supponendo che tu voglia avere un intervallo tra xa y

range(x,y+1)

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

utilizzare l'elenco per il supporto 3.x.


2

In Python puoi farlo molto facilmente

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

oppure puoi creare una funzione ricorsiva che restituisce un array fino a un determinato numero:

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

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


0

Il modo più elegante per farlo è usare la rangefunzione, tuttavia se vuoi ricreare questa logica puoi fare qualcosa del genere:

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

Questo produce l'output:

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

Come espresso prima da @Jared, il modo migliore è usare il rangeo numpy.arrangecomunque trovo il codice interessante da condividere.


list (custom_range (10,3,1)) restituisce un elenco vuoto.
Denis Rasulev,

anzi, come [x for x in range(10, 3, 1)]- il primo argomento è l'inizio, il secondo la fine e l'ultimo il passo. ==> stop> start
Michael

0

Ogni risposta sopra presuppone che l'intervallo sia solo di numeri positivi. Ecco la soluzione per restituire un elenco di numeri consecutivi in ​​cui gli argomenti possono essere qualsiasi (positivo o negativo), con la possibilità di impostare un valore di passaggio facoltativo (impostazione predefinita = 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

Ad esempio, il comando standard list(range(1,-3))restituisce un elenco vuoto [], mentre questa funzione restituisce[-3,-2,-1,0,1]

Aggiornato : ora il passaggio potrebbe essere negativo. Grazie @Michael per il suo commento.


1
Questo presuppone che il tuo passo sia positivo.
Michael

@Michael, buon punto. Ho aggiornato il codice, quindi ora puoi avere passaggi negativi :)
Denis Rasulev,

@tgikal, esatto. Ma cosa succede se non sai quali valori verranno assegnati agli argomenti della tua funzione e hai bisogno di un ritorno ordinato?
Denis Rasulev,

Non vedo alcuna funzionalità aggiuntiva che la tua funzione personalizzata fa che non può essere realizzata utilizzando la funzione range incorporato, immagino che un esempio di miglioramento sarebbe ottimo, dal momento che il tuo esempio attuale è sostanzialmente i_min = -3, i_max = 1 any_number_range(i_max, i_min))restituito [-3,-2,-1,0,1] Ma, builtin list(range(i_min, i_max + 1))restituirà gli stessi valori.
tgikal,

Prova a fare un passo negativo quando la sequenza sta diminuendolist(range(1,-3, -1))
Juan Antonio Roldán Díaz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.