Gibt es eine pythonische Möglichkeit, eine Liste im ersten Element und den "Schwanz" in einem einzigen Befehl zu entpacken?
Beispielsweise:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
Antworten:
Unter Python 3.x können Sie dies gut tun:
Eine neue Funktion in 3.x ist die Verwendung des
*
Operators beim Auspacken, um zusätzliche Werte zu bezeichnen. Es ist in PEP 3132 - Erweitertes iterierbares Auspacken beschrieben . Dies hat auch den Vorteil, dass an iterierbaren Sequenzen gearbeitet werden kann, nicht nur an Sequenzen.Es ist auch sehr gut lesbar.
Wie im PEP beschrieben, müssen Sie Folgendes tun, wenn Sie das Äquivalent unter 2.x ausführen möchten (ohne möglicherweise eine temporäre Liste zu erstellen):
Wie in den Kommentaren erwähnt, bietet dies auch die Möglichkeit, einen Standardwert für zu erhalten,
head
anstatt eine Ausnahme auszulösen. Wenn Sie dieses Verhalten wünschen, verwenden Sienext()
ein optionales zweites Argument mit einem Standardwert. Wennnext(it, None)
SieNone
also kein head-Element hätten, würden Sie dies angeben.Wenn Sie an einer Liste arbeiten, ist der einfachste Weg ohne die 3.x-Syntax natürlich:
quelle
__getitem__
/__setitem__
ausführen, die eingebaute Liste jedoch nicht.quelle
Für die Komplexität der O (1) -Operation
head,tail
sollten Sie jedoch verwendendeque
.Folgender Weg:
Dies ist nützlich, wenn Sie alle Elemente der Liste durchlaufen müssen. Zum Beispiel beim naiven Zusammenführen von 2 Partitionen in der Zusammenführungssortierung.
quelle
head, tail = l.popleft(), l
lautet ~ O (1).head, tail = seq[0], seq[1:]
ist O (n).head = l.popleft()
undtail
ist nur ein Alias fürl
. Wenn sich auchl
Änderungentail
ändern.Python 2 mit Lambda
quelle
head, tail = lst[0], lst[1:]
? Wenn OP bedeutet, ein Literal zu verwenden, könnte er Kopf und Schwanz manuell teilenhead, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
in der vorherigen Zeile). (2) Wenn Sie dies tun,head, tail = lst[0], lst[1:]
bleibt der Code für Nebenwirkungen offen (berücksichtigen Siehead, tail = get_list()[0], get_list()[1:]
) und unterscheidet sich von der Form von Ophead, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
.Aufbauend auf der Python 2-Lösung von @GarethLatty können Sie im Folgenden eine einzelne Zeile ohne Zwischenvariablen in Python 2 erhalten.
Wenn es ausnahmesicher sein soll (dh leere Liste unterstützt), fügen Sie Folgendes hinzu:
Wenn Sie es ohne das Semikolon tun möchten, verwenden Sie:
quelle