Apa cara paling efisien untuk beralih antara 0
dan 1
?
python
python-3.x
codeforester
sumber
sumber
Jawaban:
Solusi menggunakan NOT
Jika nilainya boolean, pendekatan tercepat adalah menggunakan operator not :
Solusi menggunakan pengurangan
Jika nilainya berupa numerik, pengurangan dari total adalah cara sederhana dan cepat untuk mengubah nilai:
Solusi menggunakan XOR
Jika nilainya berubah antara 0 dan 1 , Anda dapat menggunakan eksklusif bitwise-atau :
Teknik ini menggeneralisasi pasangan bilangan bulat apa pun. Langkah xor-oleh-satu diganti dengan konstanta xor-oleh-dihitung-awal:
(Ide ini diajukan oleh Nick Coghlan dan kemudian digeneralisasikan oleh @zxxc.)
Solusi menggunakan kamus
Jika nilainya dapat dicirikan, Anda dapat menggunakan kamus:
Solusi menggunakan ekspresi kondisional
Cara paling lambat adalah dengan menggunakan ekspresi bersyarat :
Solusi menggunakan itertools
Jika Anda memiliki lebih dari dua nilai, fungsi itertools.cycle () menyediakan cara cepat umum untuk beralih di antara nilai-nilai yang berurutan:
Perhatikan bahwa dalam Python 3
next()
metode diubah menjadi__next__()
, jadi baris pertama sekarang akan ditulis sebagaitoggle = itertools.cycle(['red', 'green', 'blue']).__next__
sumber
.next()
telah diganti dengannext()
fungsi global . Contoh di atas akan menjadi:toggle = itertools.cycle(...); next(toggle)
toggle = itertools.cycle(['red', 'green', 'blue'])
next(toggle)
a
danb
penggunaanx = x ^ (a ^ b)
.int(not 0)
danint(not 1)
...Saya selalu menggunakan:
Jika p adalah boolean, ini beralih antara benar dan salah.
sumber
p
tidak perlu direferensikan dua kali agar metode ini bekerja !! Ide jika Anda mengubah nilai dengan referensi yang panjang.^=
adalah bitwise xor assigmentBerikut cara non-intuitif lainnya. Yang menarik adalah Anda dapat memutar beberapa nilai dan bukan hanya dua [0,1]
Untuk Dua nilai (toggling)
Untuk Beberapa Nilai (katakanlah 4)
Saya tidak berharap solusi ini menjadi yang tercepat juga
sumber
The
not
Operator meniadakan variabel Anda (mengubahnya menjadi boolean jika tidak sudah satu). Anda mungkin dapat menggunakan1
dan secara0
bergantian denganTrue
danFalse
, jadi negasikan saja:Tetapi jika Anda menggunakan dua nilai arbitrer, gunakan sebaris
if
:sumber
toggle = 0 if toggle else 1
lebih pendek dan lebih umumif
untuk beralih antara dua variabel sembarang , bukan hanya1
dan0
.Hanya antara 1 dan 0, lakukan ini
x dapat mengambil 1 atau 0
sumber
True
danFalse
sebenarnya bilangan bulat, meskipun dengan__str__()
metode verbose yang mengejutkan ,x
juga bisaTrue
atau diFalse
sini. Anda akan mendapatkan kembali 1 atau 0.Pendekatan trigonometri , hanya karena
sin
dancos
fungsinya keren.sumber
Anehnya tidak ada yang menyebutkan modulo 2 divisi lama yang bagus:
Perhatikan bahwa ini setara dengan
x = x - 1
, tetapi keuntungan dari teknik modulo adalah bahwa ukuran grup atau panjang interval bisa lebih besar dari hanya 2 elemen, sehingga memberi Anda skema interleaving yang mirip dengan round-robin untuk mengulang.Sekarang hanya untuk 2 orang, toggling bisa sedikit lebih pendek (menggunakan operator bit-bijaksana):
sumber
salah satu cara untuk beralih adalah dengan menggunakan Tugas ganda
Menggunakan itertools:
sumber
Cara termudah untuk beralih antara 1 dan 0 adalah mengurangi 1.
sumber
Menggunakan penangan pengecualian
Oke, saya yang terburuk:
sumber
Bagaimana dengan sakelar imajiner yang menyimpan tidak hanya sakelar saat ini, tetapi beberapa nilai lain yang terkait dengannya?
Simpan nilai + atau - di sebelah kiri, dan nilai yang tidak bertanda tangan di sebelah kanan:
Zero juga berfungsi:
Dengan mudah mengambil nilai sakelar saat ini (
True
danFalse
mewakili + dan -), nilai LHS (nyata), atau nilai RHS (imajiner):Mudah menukar LHS dan RHS (tetapi perhatikan bahwa tanda kedua nilai tidak boleh penting):
Tukar LHS dan RHS dengan mudah dan juga beralih pada saat bersamaan:
Penjaga dari kesalahan:
Lakukan perubahan pada LHS dan RHS:
... tapi hati-hati memanipulasi RHS:
sumber
Variabel a dan b dapat berupa dua nilai APA SAJA, seperti 0 dan 1, atau 117 dan 711, atau "head" dan "tails". Tidak ada matematika yang digunakan, hanya pertukaran cepat nilai setiap kali sakelar diinginkan.
sumber
Saya menggunakan fungsi abs, sangat berguna pada loop
x akan menjadi 0.
sumber
Mari kita lakukan peretasan bingkai. Alihkan variabel dengan nama. Catatan: Ini mungkin tidak berfungsi dengan setiap runtime Python.
Misalkan Anda memiliki variabel "x"
sumber
Jika Anda berurusan dengan variabel integer, Anda dapat menaikkan 1 dan membatasi set Anda ke 0 dan 1 (mod)
sumber
Perpindahan antara -1 dan +1 dapat diperoleh dengan perkalian sebaris; digunakan untuk perhitungan pi dengan cara 'Leibniz' (atau serupa):
sumber
Anda dapat memanfaatkan
index
darilist
s.Kelebihan : Tidak ada pustaka tambahan, kode penjelasan mandiri, dan bekerja dengan tipe data arbitrer.
Cons : tidak duplikat-simpan.
toggleValues(["one","two","duped", "three", "duped", "four"], "duped")
akan selalu kembali"three"
sumber