Python - Liste mit Zahlen zwischen 2 Werten erstellen?


355

Wie würde ich eine Liste mit Werten zwischen zwei von mir eingegebenen Werten erstellen? Beispielsweise wird die folgende Liste für Werte von 11 bis 16 generiert:

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

Antworten:


643

Verwenden Sie range. In Python 2.x wird eine Liste zurückgegeben, sodass Sie lediglich Folgendes benötigen:

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

In Python 3.x rangeist ein Iterator. Sie müssen es also in eine Liste konvertieren:

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

Hinweis : Die zweite Nummer ist exklusiv. Also, hier muss es sein 16+1=17

BEARBEITEN:

Um auf die Frage nach dem Inkrementieren um zu antworten, ist 0.5es wahrscheinlich am einfachsten, numpys arange() und .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
Genial! Genau das, wonach ich gesucht habe! Gibt es auch eine Möglichkeit, um kleinere Werte wie 0,5 als nur 1 zu erhöhen? also [11.0, 11.5, 12.0 ...... 16.0]
Lorde

2
@lorde Sie können mit einem dritten stepParameter um mehr als 1 erhöhen, aber das ist immer noch ein int - nicht float. Sie können das nicht genau in der Standardbibliothek tun.
Jared

@Jared kann ich eine Liste erstellen, indem ich nach einem bestimmten Intervall einen Wert lösche. wie [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
Gut, um über Python 2.x und 3.x zu erzählen.
Sigur

Wenn Sie unter Umständen arbeiten, unter denen Numpy unerwünscht ist, berücksichtigen Sie (wobei x = 11, y = 17 und Schritt = 0,5 wie oben): a_range = [x] + [x + (Schritt * i) für i im Bereich (int ((yx) / Schritt))]
TheLoneDeranger

23

Sie scheinen zu suchen 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]

Zum Inkrementieren um 0.5statt 1sagen Sie:

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

Nur ein kleiner Trottel. Im ersten Codeblock verwenden Sie listals Variable.
Schlangen und Kaffee

2
In Python listist eine eingebaute Klasse, so dass seine Verwendung als Variable etwas entmutigt wird
Schlangen und Kaffee

x * Inkrement, aber was meinst du mit 2 * Startwert, wofür? würdest du bitte erklären
Santosa Sandy

7

Versuchen:

range(x1,x2+1)  

Das ist eine Liste in Python 2.x und verhält sich meistens wie eine Liste in Python 3.x. Wenn Sie Python 3 ausführen und eine Liste benötigen, die Sie ändern können, verwenden Sie:

list(range(x1,x2+1))

5

Wenn Sie nach einer bereichsähnlichen Funktion suchen, die für den Float-Typ funktioniert, dann ist hier ein sehr guter Artikel .

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

Ausgabe:

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

Verwenden Sie das Listenverständnis in Python. Da du auch 16 in der Liste haben willst .. Verwende x2 + 1. Die Bereichsfunktion schließt die Obergrenze in der Funktion aus.

list = [x für x im Bereich (x1, x2 + 1)]


1
Wenn Sie range()keine Notwendigkeit verwenden, ein Listenverständnis zu verwenden
Billal Begueradj

@BillalBegueradj In Python3 gibt range () anstelle einer Liste ein generatorähnliches Objekt zurück. Es ist im Grunde dasselbe wie xrange () in Python 2. Sie haben Recht, dass das Listenverständnis nicht erforderlich ist. Die integrierte Funktion list () ist einfacher : list(range(x1, x2+1)).
Mike Housky

3

Angenommen, Sie möchten einen Bereich zwischen x und y haben

range(x,y+1)

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

Verwenden Sie die Liste für die 3.x-Unterstützung


2

In Python können Sie dies sehr schnell tun

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

oder Sie können eine rekursive Funktion erstellen, die ein Array bis zu einer bestimmten Zahl zurückgibt:

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

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


0

Der eleganteste Weg, dies zu tun, ist die Verwendung der rangeFunktion. Wenn Sie diese Logik jedoch neu erstellen möchten, können Sie Folgendes tun:

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

Dies erzeugt die Ausgabe:

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

Wie bereits von @Jared erwähnt, ist es am besten , den Code zu verwenden, rangeoder numpy.arrangeich finde den Code interessant, um ihn zu teilen.


list (custom_range (10,3,1)) gibt eine leere Liste zurück.
Denis Rasulev

in der Tat, wie [x for x in range(10, 3, 1)]- das erste Argument ist der Anfang, das zweite das Ende und das letzte der Schritt. ==> Stop> Start
Michael

0

Bei jeder obigen Antwort wird davon ausgegangen, dass der Bereich nur aus positiven Zahlen besteht. Hier ist die Lösung, um eine Liste von fortlaufenden Zahlen zurückzugeben, bei denen Argumente beliebig sein können (positiv oder negativ), mit der Möglichkeit, einen optionalen Schrittwert festzulegen (Standard = 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

Beispielsweise gibt der Standardbefehl eine list(range(1,-3))leere Liste zurück [], während diese Funktion zurückgegeben wird[-3,-2,-1,0,1]

Aktualisiert : Jetzt kann der Schritt negativ sein. Danke @Michael für seinen Kommentar.


1
Dies setzt voraus, dass Ihr Schritt positiv ist.
Michael

@ Michael, guter Punkt. Ich habe den Code aktualisiert, so dass Sie jetzt negative Schritte haben können :)
Denis Rasulev

@tgikal, das stimmt. Aber was ist, wenn Sie nicht wissen, welche Werte den Argumenten Ihrer Funktion zugewiesen werden und Sie eine sortierte Rückgabe benötigen?
Denis Rasulev

Ich sehe keine zusätzlichen Funktionen, die Ihre benutzerdefinierte Funktion mit der integrierten Bereichsfunktion nicht ausführen kann. Ich denke, ein Beispiel für die Verbesserung wäre großartig, da Ihr aktuelles Beispiel im Grunde i_min = -3, i_max = 1 any_number_range(i_max, i_min))zurückgegeben [-3,-2,-1,0,1] wird. Eingebaute Funktionen geben list(range(i_min, i_max + 1))jedoch dieselben Werte zurück.
Tgikal

Versuchen Sie, einen negativen Schritt zu verwenden, wenn die Sequenz abnimmtlist(range(1,-3, -1))
Juan Antonio Roldán Díaz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.