Apakah ada cara yang lebih pendek untuk menetapkan satu dari dua variabel dalam Python?

19

Ini adalah pertanyaan untuk bermain golf di .

Dalam banyak golf yang saya lakukan dengan Python, nilai tetap diberikan ke salah satu dari dua variabel yang dipilih oleh Boolean. Variabel yang dipilih ditimpa oleh nilai yang diberikan, dan yang lainnya tidak berubah.

17 karakter:

if b:y=z
else:x=z

Menetapkan nilai kondisional itu mudah , tetapi menetapkan ke variabel kondisional tampaknya kikuk. Saya bertanya-tanya apakah ada cara yang lebih pendek saya hilang.

Ini akan mudah jika x,ybukan daftar L, tetapi menganggap konteksnya memerlukan merujuk pada variabel cukup bahwa menulis L[0]dan L[1]dilarang. Konversi terlalu lama:

20 karakter:

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

Cara tercepat yang saya tahu adalah dengan Python 2 exec, yang aneh:

16 karakter, Python 2:

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

Memilih Tuple tampaknya lebih lama:

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 

Apakah ada metode yang lebih pendek atau optimasi hemat karakter? Anda dapat berasumsi badalah 0atau 1, bukan hanya Falsey atau Truthy, dan juga membuat asumsi tentang tipe dan nilai data jika itu membantu.

Tidak
sumber
1
Saya tidak tahu sesuatu yang lebih baik. Jika Anda perlu melakukan ini banyak, Anda dapat melakukan x,y=C(x,y,z,b)(14 karakter) dan mendorong salah satu dari implementasi ini ke dalam tubuh C.
Keith Randall
Mengapa ini tidak ada di Stack Overflow?
BobTheAwesome
14
@ BobTheAwesome Saya tidak meminta cara yang baik untuk melakukan ini, hanya yang singkat.
xnor

Jawaban:

26

12 karakter / tugas + 9 karakter biaya overhead

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

Perhatikan bahwa ini hanya berfungsi pada lingkup global, tidak berfungsi di dalam suatu fungsi.

Keith Randall
sumber
1
Wow, saya tidak tahu tentang ini. Dan itu keren bahwa Vpembaruan secara otomatis, tanpa perlu memanggil fungsi lagi. Jadi ini impas dengan execdua penggunaan. Juga, hanya melakukan vars()["xy"[b]]=zadalah 17 karakter, yang merupakan yang terbaik yang kami miliki sejauh ini untuk Python 3, tanpa aliran kontrol if/elseyang dapat menyebabkan masalah.
xnor
3
Ini sebenarnya 9 karakter overhead karena baris baru atau titik koma harus mengikuti tugas.
xnor
1
Jika Anda hanya perlu melakukannya sekali, dapatkah Anda melakukannya vars()["xy"[b]]=z:?
aebabis
@acbabis: ya, seperti yang ditunjukkan xnor.
Keith Randall
19

14 karakter, Python 2

exec"xy=z"[b:]

Dua variabel tersebut adalah ydan xy. Jika b = 0, ini ditetapkan xy=z. Jika b = 1, ini ditetapkan y=z. Ini akan sia-sia jika xydigunakan tidak lebih dari satu kali di tempat lain dalam kode.

isaacg
sumber
2
Sangat pintar! Saya menduga Anda biasanya perlu menggunakan xysetidaknya dua kali, untuk tugas awalnya, dan membacanya setelah itu.
xnor
15

15 karakter, Python 2

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

Mengharuskan bahwa variabel dipanggil Fdan Tbukannya xdan y, dan itu b is Falseatau b is True, daripada menjadi angka yang sama0 atau 1.

Ini menyimpan char dari "xy"[b]alih-alih mengambil huruf pertama dari representasi string b, yaitu Tatau F.

Tidak
sumber
7
Perhatikan bahwa variabel juga bisa dipanggil adan r, ldan uatau sdan e, dengan indeks yang sesuai.
isaacg