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.


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.


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.


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.


7
Perhatikan bahwa variabel juga bisa dipanggil adan r, ldan uatau sdan e, dengan indeks yang sesuai.
isaacg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.