web-dev-qa-db-de.com

Python 3 dreht den Bereich zu einer Liste

Ich versuche, eine Liste mit Zahlen 1-1000 zu erstellen. Natürlich wäre das Schreiben/Lesen ärgerlich, also versuche ich, eine Liste mit einem Bereich darin zu erstellen. In Python 2 scheint es so zu sein:

some_list = range(1,1000)

hätte funktioniert, aber in Python 3 ähnelt der Bereich der xrange von Python 2?

Kann jemand einen Einblick in das geben?

106
Boathouse

Sie können einfach eine Liste aus dem Bereichsobjekt erstellen:

my_list = list(range(1, 1001))

So machen Sie es auch mit Generatoren in python2.x. Normalerweise benötigen Sie wahrscheinlich keine Liste, da Sie my_list[i] effizienter (i + 1) verwenden können. Wenn Sie nur durchlaufen müssen, können Sie einfach auf range zurückgreifen.

Beachten Sie außerdem, dass xrange auf python2.x noch indizierbar ist1. Dies bedeutet, dass range auf python3.x auch dieselbe Eigenschaft hat2

1print xrange(30)[12] funktioniert für python2.x

2Die analoge Aussage zu 1 in python3.x ist print(range(30)[12]) und das funktioniert auch.

136
mgilson

in Python 3.x hat die Funktion range() einen eigenen Typ. In diesem Fall müssen Sie den Iterator verwenden

list(range(1000))

22

In Pythons <= 3.4 können Sie, wie von anderen vorgeschlagen, list(range(10)) verwenden, um aus einem Bereich eine Liste zu erstellen (im Allgemeinen beliebig iterierbar).

Eine andere in Python 3.5 eingeführte Alternative mit ihren Auspack-Verallgemeinerungen ist die Verwendung von * in einem Listenliteral []:

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Obwohl dies äquivalent zu list(r) ist, ist es eine wörtliche Syntax und die Tatsache, dass kein Funktionsaufruf beteiligt ist, führt dazu, dass der Befehl schneller ausgeführt wird. Es sind auch weniger Charaktere, wenn Sie Golf spielen müssen :-)

Der Grund, warum Python3 keine Funktion zum direkten Abrufen einer Bereichsliste hat, liegt darin, dass der ursprüngliche Python3-Designer in Python2 ein Neuling war. Er hat nur die Verwendung der Funktion range () in einer for-Schleife berücksichtigt, daher sollte die Liste niemals erweitert werden müssen. In der Tat müssen wir häufig die Funktion range () verwenden, um eine Liste zu erstellen und an eine Funktion zu übergeben.

Daher ist Python3 in diesem Fall weniger bequem als Python2, weil:

  • In Python2 haben wir xrange () und range (); 
  • In Python3 haben wir range () und list (range ())

Dennoch können Sie die Listenerweiterung auf diese Weise verwenden:

[*range(N)]
5
xuancong84

Sie sollten wirklich nicht die Nummern 1-1000 in einer Liste verwenden müssen. Wenn Sie aus irgendeinem Grund wirklich diese Zahlen benötigen, könnten Sie Folgendes tun:

[i for i in range(1, 1001)]

Listenverständnis auf den Punkt gebracht:

Das obige Listenverständnis übersetzt in:

nums = []
for i in range(1, 1001):
    nums.append(i)

Dies ist nur die Listenverständnissyntax, jedoch ab 2.x. Ich weiß, dass dies in Python 3 funktionieren wird, aber ich bin nicht sicher, ob es auch eine aktualisierte Syntax gibt

Der Bereich beginnt mit dem ersten Parameter. endet jedoch auf/zu, nicht eingeschlossen der zweite Parameter (wenn 2 Parameter angegeben werden; wenn der erste Parameter nicht angegeben ist, beginnt er mit '0') 

range(start, end+1)
[start, start+1, .., end]
4
inspectorG4dget

Wenn Sie 1-1000 (einschließlich) möchten, verwenden Sie die Funktion range(...) mit den Parametern 1 und 1001: range(1, 1001), da die Funktion range(start, end) vom Anfang bis (Ende-1) einschließlich geht.

3
CosmicComputer

Tatsächlich ist dies eine Retrogradation von Python3 im Vergleich zu Python2. Sicherlich ist Python2, das range () und xrange () verwendet, bequemer als Python3, das list (range ()) und range () verwendet. Der Grund dafür ist, dass der ursprüngliche Designer von Python3 nicht sehr erfahren ist. Er hat lediglich die Verwendung der Range-Funktion von vielen Anfängern für das Durchlaufen einer großen Anzahl von Elementen in Betracht gezogen, bei denen sowohl Speicher als auch CPU ineffizient sind. Sie vernachlässigten jedoch die Verwendung der Range-Funktion zur Erstellung einer Nummernliste. Nun ist es zu spät, um sich schon wieder zu ändern.

Wenn ich der Designer von Python3 sein sollte, werde ich:

  1. verwenden Sie irange, um einen Sequenz-Iterator zurückzugeben
  2. verwenden Sie lrange, um eine Sequenzliste zurückzugeben
  3. bereich verwenden, um entweder einen Sequenz-Iterator zurückzugeben (wenn die Anzahl der Elemente groß ist, z. B. Bereich (9999999)) oder eine Sequenzliste (wenn die Anzahl der Elemente klein ist, z. B. Bereich (10))

Das sollte optimal sein.

0
xuancong84

Verwenden Sie Range in Python 3.

Hier ist eine Beispielfunktion, die Zahlen zwischen zwei Zahlen zurückgibt

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

Ergebnis

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]
0
Rajiv Sharma