2009-06-23 34 views
9

Değişkenler listesinde yalnızca bir değişkenin bir True değerine sahip olup olmadığını kontrol etmek için basit bir yöntem arıyorum. Bu logical xor post'a baktım ve birden çok değişkene uyum sağlamanın bir yolunu bulmaya çalışıyor ve sadece bir tane doğru.Değişkenler listesinde yalnızca bir değişkenin ayarlanmış olup olmadığını kontrol edin

Örnek

>>>TrueXor(1,0,0) 
True 

>>>TrueXor(0,0,1) 
True 

>>>TrueXor(1,1,0) 
False 

>>>TrueXor(0,0,0,0,0) 
False 

cevap

16

inşa bir rapor yok ama sahibi rulo zor değil yani: "[b] ooleans yana

def TrueXor(*args): 
    return sum(args) == 1 

düz bir alt tipi vardır tamsayılar "(source) tamsayılar listesini kolayca toplayabilir ve gerçek boole'ları da bu işleve iletebilirsiniz.

Yani bu iki çağrıları homojen şunlardır:

TrueXor(1, 0, 0) 
TrueXor(True, False, False) 

müstehcen boole dönüşüm isterseniz: sum(bool(x) for x in args) == 1.

+0

Bunu sevdim - arc'ları açıkça boğa dönüştürmek için güncelleyebilir misiniz? –

+2

Sanırım "toplamı (bob (a), args için) == 1" - değişkenlerin kendisi boole olmayabilir. – elo80ka

+0

Ben sadece bir gömlekleri seviyorum. Yeni boollar hakkında yeni bir şey öğrendim. – Deon

3
>>> def f(*n): 
...  n = [bool(i) for i in n] 
...  return n.count(True) == 1 
... 
>>> f(0, 0, 0) 
False 
>>> f(1, 0, 0) 
True 
>>> f(1, 0, 1) 
False 
>>> f(1, 1, 1) 
False 
>>> f(0, 1, 0) 
True 
>>> 
1

Zaten bağlandığınız soru iki değişken için çözüm sağlar. Tek yapmanız gereken, n değişkenleri üzerinde çalışmak için genişletmektir:

import operator 

def only_one_set(*vars): 
    bools = [bool(v) for v in vars] 
    return reduce(operator.xor, bools, False) 

>>> a, b, c, d, e = False, '', [], 10, -99 
>>> only_one_set(a, b, c, d) 
True 
>>> only_one_set(a, b, c, d, e) 
False 
+1

Her zamanki gibi, azaltmak yanlış bir arkadaştır: bu aslında gerçek değerlerin bir ODD numarası olup olmadığını kontrol eder - sadece 1 ile 7 veya 77 olanlar kadar mutlu olacak! –

+0

Haklısın ... ama sanırım suç, 'mantıksızlığından' hatalı mantığımdan daha fazlası olurdu. İşaret ettiğin için teşekkürler. – elo80ka

1

İşte benim doğrudan yaklaşımım. Birden fazla girdiyle xor'dan bu yana sadece yeniden adlandırdım, genellikle "tek bir" denetleyici değil, bir parite denetleyicisi.

def only_one(*args): 
    result = False 
    for a in args: 
     if a: 
      if result: 
       return False 
      else: 
       result = True 
    return result 

Test:

>>> only_one(1,0,0) 
True 
>>> only_one(0,0,1) 
True 
>>> only_one(1,1,0) 
False 
>>> only_one(0,0,0,0,0) 
False 
>>> only_one(1,1,0,1) 
False 
7

Ben toplamı tabanlı çözüm verilen örneğin iyi olduğunu düşünüyorum, ama kısa devre daima piton kendi değerlendirmesini yüklemler'ıN boolean unutmayın. Yani all and any ile daha tutarlı bir şey düşünmek isteyebilirsiniz.

def any_one(iterable): 
    it = iter(iterable) 
    return any(it) and not any(it) 
+1

Güzel. "Herhangi bir (it)" nin, herhangi bir (it) 'tarafından bırakılan eşyaların geri kalanı üzerinde, yineleyicilerle rahat etmeyen insanlar için çalıştığını açıklamalısınız. – tzot

+0

Burada bu kullanım hakkında sağlıklı bir tartışma var: http://stackoverflow.com/a/16801605/4403872, ve burada: http://stackoverflow.com/a/16522290/4403872 – vk1011

İlgili konular