Pythonで2つの変数のいずれかを割り当てるより短い方法はありますか?


19

これはでのゴルフの質問です。

Pythonで行った複数のゴルフでは、ブール値によって選択された2つの変数のいずれかに固定値が割り当てられます。選択された変数は指定された値で上書きされ、もう一方は変更されません。

17文字:

if b:y=z
else:x=z

条件値の割り当ては簡単ですが、条件変数への割り当ては不格好に思えます。私が見逃している短い方法があるのだろうかと思っています。

x,y代わりにlistを使用した場合、これは簡単にLなりますが、コンテキストでは書き込みL[0]を行うのに十分な変数の参照が必要でL[1]あり、禁止されていると想定します。変換に時間がかかりすぎる:

20文字:

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

私が知っている最速の方法は、Python 2を使用することですexec。これは奇妙です。

16文字、Python 2:

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

タプル選択はより長いようです:

18、19、18、18文字:

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 

より短い方法や文字を節約する最適化はありますか?あなたは想定できbている01、またはFalsey Truthyだけではなく、それが助け場合も、データ型と値についての仮定を行います。


1
私はこれ以上良いことを知りません。これを頻繁に行う必要がある場合は、x,y=C(x,y,z,b)(14文字)を実行し、これらの実装のいずれかをの本体にプッシュできCます。
キースランドール

なぜスタックオーバーフローではないのですか?
BobTheAwesome

14
@BobTheAwesomeこれを行う良い方法を求めているのではなく、短いものを求めています。
xnor

回答:


26

12文字/割り当て+ 9文字のオーバーヘッド

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

これはグローバルスコープでのみ機能し、関数内では機能しないことに注意してください。


1
うわー、私はこれについて知りませんでした。またV、関数を再度呼び出す必要なく、自動的に更新されるのは素晴らしいことです。そのため、これexecは2つの用途においても破られます。また、ちょうどvars()["xy"[b]]=z17文字です。これは、制御フローがif/else問題を引き起こす可能性がないため、Python 3でこれまでのところ最高です。
xnor

3
改行またはセミコロンが割り当てに従う必要があるため、実際には9文字のオーバーヘッドです。
xnor

1
一度だけ行う必要がある場合、次のことができますvars()["xy"[b]]=zか?
aebabis

@acbabis:はい、xnorが指摘したように。
キースランドール

19

14文字、Python 2

exec"xy=z"[b:]

二つの変数があるyxy。b = 0の場合、これはを設定しますxy=z。b = 1の場合、これはを設定しますy=zxyコードの別の場所で1回しか使用しない場合、これは価値があります。


2
非常に賢い!xyただし、通常は、最初の割り当てのために少なくとも2回使用し、後で読み取る必要があると思います。
xnor

15

15文字、Python 2

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

変数が呼ばれることを要求FしてTではなく、xかつy、そのb is Falseあるいはb is True、むしろ同数というより01

このからチャーを保存"xy"[b]代わりの文字列表現の最初の文字とることによりbで、TまたはF


7
変数は、適切なインデックスを使用してaand rland uまたはsand とも呼び出すことができeます。
isaacg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.