Ich versuche eine Liste mit Zahlen 1-1000
zu erstellen. Das Schreiben / Lesen wäre natürlich ärgerlich, daher versuche ich, eine Liste mit einem Bereich darin zu erstellen. In Python 2 scheint es, dass:
some_list = range(1,1000)
hätte funktioniert, aber in Python 3 ist der Bereich ähnlich wie xrange
in Python 2?
Kann jemand einen Einblick geben?
python
python-3.x
list
range
Bootshaus
quelle
quelle
some_list[i] == i+1
brauchen Sie wahrscheinlich sowieso keine Liste.Antworten:
Sie können einfach eine Liste aus dem Bereichsobjekt erstellen:
So machen Sie es auch mit Generatoren in python2.x. In der Regel benötigen Sie jedoch wahrscheinlich keine Liste, da Sie den Wert von
my_list[i]
effizienter (i + 1
) ermitteln können. Wenn Sie nur darüber iterieren müssen, können Sie einfach darauf zurückgreifenrange
.Beachten Sie auch, dass auf python2.x
xrange
immer noch indizierbar ist 1 . Dies bedeutet, dassrange
auf python3.x auch die gleiche Eigenschaft 2 hat1
print xrange(30)[12]
funktioniert für python2.x2 Die analoge Aussage zu 1 in python3.x ist
print(range(30)[12])
und das funktioniert auch.quelle
list(arg)
wird in anderen Sprachen als Aufruf eines Konstruktors derlist
Klasse verstanden. Eigentlich ist es auch der Python-Fall. Die Debatten, ob das Objekt während der Konstruktion (wie im C ++ - Fall) oder nur während der ersten automatisch aufgerufenen Methode (wie in der Python-__init__()
Methode) gefüllt wird, können die abstrakte Grundidee nicht ändern. Meiner Ansicht nach nimmt der Listenkonstruktor den Iterator und füllt die Liste mit den zurückgegebenen Werten .'range' object is not callable
In Pythons <= 3.4 können Sie, wie andere vorgeschlagen haben,
list(range(10))
eine Liste aus einem Bereich erstellen (im Allgemeinen jede iterierbare).Eine andere Alternative, die in Python
3.5
mit seinen Entpackungsverallgemeinerungen eingeführt wurde, ist die Verwendung*
in einem Listenliteral[]
:Dies entspricht zwar
list(r)
der wörtlichen Syntax und der Tatsache, dass kein Funktionsaufruf beteiligt ist, ermöglicht jedoch eine schnellere Ausführung. Es sind auch weniger Zeichen, wenn Sie Golf codieren müssen :-)quelle
[*range(10)]
einwandfrei, wenn Sie dasrange
für keinen Zweck benötigen, sondern das Initialisieren deslist
. Randnotiz: Mein Lieblingsteil (okay, nicht wirklich) beim Entpacken von Verallgemeinerungen ist, dass leereset
s jetzt eine wörtliche Syntax haben{*()}
, oder wie ich es nenne, den einäugigen Affenoperator. ;-)In Python 3.x hat die
range()
Funktion einen eigenen Typ. In diesem Fall müssen Sie den Iterator verwendenlist(range(1000))
quelle
list(range(1000))()
Der Grund, warum Python3 keine Funktion zum direkten Abrufen einer Fernkampfliste bietet, liegt darin, dass der ursprüngliche Python3-Designer in Python2 ein Anfänger war. Er hat nur die Verwendung der
range()
Funktion in einer for-Schleife in Betracht gezogen , daher sollte die Liste niemals erweitert werden müssen. Tatsächlich müssen wir dierange()
Funktion sehr oft verwenden , um eine Liste zu erstellen und an eine Funktion zu übergeben.Daher ist Python3 in diesem Fall im Vergleich zu Python2 weniger praktisch, weil:
xrange()
undrange()
;range()
undlist(range())
Trotzdem können Sie die Listenerweiterung folgendermaßen verwenden:
quelle
list
, weil das normalerweise das Falsche ist. Für 99 von 100 Anwendungsfälle, eine tatsächliche Herstellunglist
ist ineffizient und sinnlos, darange
sich wie eine unveränderliche Sequenz wirkt in fast jeder Hinsicht, manchmal effizienter zu booten (zB Containment - Tests fürint
s sindO(1)
, gegenüberO(n)
fürlist
s). In Python 2 wurderange
standardmäßig verwendet, obwohl diesxrange
fast immer die bessere Option war. In Python 3 können Sie sich explizit für das entscheidenlist
und es nicht versehentlich erhalten, indem Sie den falschen Namen verwenden.Sie sollten wirklich nicht die Nummern 1-1000 in einer Liste verwenden müssen. Aber wenn Sie aus irgendeinem Grund diese Zahlen wirklich brauchen, können Sie Folgendes tun:
Listenverständnis auf den Punkt gebracht:
Das obige Listenverständnis bedeutet:
Dies ist nur die Syntax des Listenverständnisses, allerdings ab 2.x. Ich weiß, dass dies in Python 3 funktioniert, bin mir aber nicht sicher, ob es auch eine aktualisierte Syntax gibt
Der Bereich beginnt einschließlich des ersten Parameters. aber Enden bis zu, nicht einschließlich dem zweiten Parameter (wenn zwei Parameter geliefert, wenn der erste Parameter weggelassen wird, wird es beginnen bei ‚0‘)
quelle
list(range(1000))
list()
Konstruktor mit einer Iterable auf . Derlist()
Konstruktor weiß, wie eine neue Liste erstellt wird, wenn ein iterierbares Objekt angegeben wird.list(range(1000))
funktioniert in Python3 genau wielist(xrange(1000))
in Python2Wenn Sie 1-1000 (einschließlich) möchten, verwenden Sie die
range(...)
Funktion mit den Parametern 1 und 1001 :range(1, 1001)
, da dierange(start, end)
Funktion von Anfang bis (Ende-1) einschließlich geht.quelle
Verwenden Sie Range in Python 3.
Hier ist eine Beispielfunktion, die zwischen Zahlen von zwei Zahlen zurückgibt
quelle
Tatsächlich ist dies eine Retro-Abstufung von Python3 im Vergleich zu Python2. Natürlich ist Python2, das range () und xrange () verwendet, bequemer als Python3, das list (range ()) bzw. range () verwendet. Der Grund dafür ist, dass der ursprüngliche Designer von Python3 nicht sehr erfahren ist. Er hat nur die Verwendung der Bereichsfunktion durch viele Anfänger in Betracht gezogen, um über eine große Anzahl von Elementen zu iterieren, bei denen sowohl Speicher als auch CPU ineffizient sind. Sie vernachlässigten jedoch die Verwendung der Bereichsfunktion zur Erstellung einer Nummernliste. Jetzt ist es zu spät für sie, sich schon wieder umzuziehen.
Wenn ich der Designer von Python3 sein sollte, werde ich:
Das sollte optimal sein.
quelle