Gibt es eine kürzere Möglichkeit, eine von zwei Variablen in Python zuzuweisen?


19

Dies ist eine zum Golfen in .

Bei mehreren Golfspielen, die ich in Python durchgeführt habe, wird einer von zwei Variablen, die von einem Booleschen Wert ausgewählt wurden, ein fester Wert zugewiesen. Die ausgewählte Variable wird mit dem angegebenen Wert überschrieben, die andere Variable bleibt unverändert.

17 Zeichen:

if b:y=z
else:x=z

Das Zuweisen eines bedingten Werts ist einfach , aber das Zuweisen zu einer bedingten Variablen scheint umständlich zu sein. Ich frage mich, ob es einen kürzeren Weg gibt, den ich vermisse.

Dies wäre einfach, wenn Sie x,ystattdessen eine Liste erstellen würden. Nehmen Sie Ljedoch an, dass der Kontext einen ausreichenden Verweis auf die Variablen erfordert L[0]und L[1]unzulässig ist. Das Konvertieren dauert zu lange:

20 Zeichen:

L=[x,y];L[b]=z;x,y=L

Der schnellste Weg, den ich kenne, ist mit Python 2 exec, was bizarr ist:

16 Zeichen, Python 2:

exec"xy"[b]+"=z"

Die Tupelauswahl scheint länger zu sein:

18, 19, 18, 18 Zeichen:

x,y=b*(x,z)or(z,y)
x,y=[z,x,y,z][b::2]
y,x=[y,z,x][b:b+2]
y,x,*_=[y,z,x][b:]   # Python 3 

Gibt es eine kürzere Methode oder eine zeichenschonende Optimierung? Sie können davon ausgehen, dass bes sich um 0oder handelt 1, nicht nur um Falsey oder Truthy, und Sie können auch Annahmen über die Datentypen und Werte treffen, wenn dies hilfreich ist.


1
Ich weiß nichts besseres. Wenn Sie dies häufig tun müssen, können Sie x,y=C(x,y,z,b)(14 Zeichen) eine dieser Implementierungen in den Rumpf von einfügen C.
Keith Randall

Warum ist das nicht in Stack Overflow?
BobTheAwesome

14
@ BobTheAwesome Ich frage nicht nach guten Möglichkeiten, nur nach kurzen.
Xnor

Antworten:


26

12 Zeichen / Zuordnung + 9 Zeichen Overhead

V=vars()     # do once at the start of the program
V["xy"[b]]=z

Beachten Sie, dass dies nur im globalen Bereich funktioniert und nicht innerhalb einer Funktion.


1
Wow, das wusste ich nicht. Und es ist cool, dass es Vautomatisch aktualisiert wird, ohne dass die Funktion erneut aufgerufen werden muss. Dies macht sich also execin zwei Fällen bezahlt. Außerdem sind es nur vars()["xy"[b]]=z17 Zeichen, was das Beste ist, was wir bisher für Python 3 haben, ohne dass der Kontrollfluss if/elseProbleme verursachen kann.
Xnor

3
Es sind tatsächlich 9 Zeichen Overhead, da der Zuweisung ein Zeilenumbruch oder ein Semikolon folgen muss.
Donnerstag,

1
Wenn Sie es nur einmal tun müssen , können Sie tun: vars()["xy"[b]]=z?
Aebabis

@acbabis: ja, wie xnor betonte.
Keith Randall

19

14 Zeichen, Python 2

exec"xy=z"[b:]

Die beiden Variablen sind yund xy. Wenn b = 0 ist, wird dies gesetzt xy=z. Wenn b = 1 ist, setzt dies y=z. Dies lohnt sich, wenn xyes nicht mehr als einmal an einer anderen Stelle im Code verwendet wird.


2
Sehr schlau! Ich vermute, Sie müssen es in der Regel xymindestens zweimal verwenden, um es zuzuordnen und anschließend vorzulesen.
Xnor

15

15 Zeichen, Python 2

exec`b`[0]+"=z"

Erfordert, dass die Variablen aufgerufen werden Fund Tnicht xund y, und b is Falseoder b is True, anstatt die gleichen Zahlen 0oder zu sein 1.

Dies erspart ein Zeichen, "xy"[b]indem stattdessen der erste Buchstabe der Zeichenfolgendarstellung von verwendet wird b, der Toder ist F.


7
Beachten Sie, dass die Variablen auch genannt werden können , aund r, lund uoder sund emit entsprechenden Indizes.
isaacg
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.