Python'da iki değişkenten birini atamanın daha kısa bir yolu var mı?


19

Bu golf için soru .

Python'da yaptığım birden fazla golfte, bir Boolean tarafından seçilen iki değişkenten birine sabit bir değer atanır. Seçilen değişkenin üzerine verilen değer yazılır ve diğeri değişmez.

17 karakter:

if b:y=z
else:x=z

Koşullu bir değer atamak kolaydır , ancak koşullu bir değişkene atamak karmaşık görünmektedir. Kaçırdığım daha kısa bir yol olup olmadığını merak ediyorum.

Bunun x,yyerine bir liste olsaydı bu kolay olurdu L, ancak bağlamın yazma için yeterince değişkene atıfta bulunmayı gerektirdiğini L[0]ve L[1]engelleyici olduğunu varsayalım . Dönüştürme işlemi çok uzun sürüyor:

20 karakter:

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

Bildiğim en hızlı yol exec, tuhaf olan bir Python 2 ile :

16 karakter, Python 2:

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

Grup seçimi daha uzun gibi görünüyor:

18, 19, 18, 18 karakter:

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 

Daha kısa bir yöntem veya karakter tasarrufu optimizasyonu var mı? Sen varsayabiliriz bolduğu 0ya 1, Falsey veya Truthy sadece, ve yardımcı olmadığını da veri türleri ve değerleri hakkında varsayımlarda bulunmak.


1
Daha iyi bir şey bilmiyorum. Bunu çok yapmanız gerekiyorsa, x,y=C(x,y,z,b)(14 karakter) yapabilir ve bu uygulamalardan herhangi birini gövdesine itebilirsiniz C.
Keith Randall

Bu neden Stack Overflow'da değil?
BobTheAwesome

14
@BobTheAwesome Bunu yapmanın iyi yollarını istemiyorum, sadece kısa olanlar.
xnor

Yanıtlar:


26

12 karakter / ödev + 9 karakter ek yük

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

Bunun yalnızca global kapsamda çalıştığını, bir işlev içinde çalışmadığını unutmayın.


1
Vay, bunu bilmiyordum. Ve Vfonksiyonu tekrar çağırmaya gerek kalmadan otomatik olarak güncellenen bir şey. Böylece bu bileexec iki kullanımda . Ayrıca, vars()["xy"[b]]=zPython 3 için şimdiye kadar sahip olduğumuz en iyisi olan 17 karakter, kontrol akışı if/elseproblemlere neden olabilir.
xnor

3
Aslında 9 karakter yükü var çünkü bir satırsonu veya noktalı virgül ödevi izlemelidir.
xnor

1
Sadece bir kez yapmanız gerekiyorsa, yapabilir misiniz vars()["xy"[b]]=z?
aebabis

@ acbabis: evet, xnor'ın işaret ettiği gibi.
Keith Randall

19

14 karakter, Python 2

exec"xy=z"[b:]

İki değişken y ve xy. B = 0 ise, bu ayarlanır xy=z. B = 1 ise, bu ayarlanır y=z. xyKodda başka bir yerde birden fazla kullanılmazsa buna değecektir .


2
Çok zeki! xyİlk görevlendirmesi için genellikle en az iki kez kullanmanız ve daha sonra okumalısınız.
xnor

15

15 karakter, Python 2

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

Değişkenler olarak adlandırılabilir gerektirir Fve Tyerine xve yve bu b is Falseya da b is Trueoldukça eşit sayıda olmak yerine 0ya da 1.

Bu, karakter "xy"[b]dizisinin temsili olan ilk harfini ( veya bolan) alarak kaydeder .TF


7
Değişkenler olarak da adlandırılabilir unutmayın ave r, lve uya da sve euygun katsayıları ile,.
isaacg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.