変数のリストで変数が1つだけ設定されているかどうかを確認します

StackOverflow https://stackoverflow.com/questions/1032411

  •  06-07-2019
  •  | 
  •  

質問

変数のリスト内の1つの変数のみがTrue値を持っているかどうかを確認する簡単な方法を探しています。 私はこれを見てきました logical xor投稿、複数の変数に適応する方法を見つけようとしています。

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

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

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

>>>TrueXor(0,0,0,0,0)
False
役に立ちましたか?

解決

組み込みのものはありませんが、所有するのは難しくありません:

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

「[b] ooleansはプレーン整数のサブタイプである」ため、 (ソース)整数のリストは非常に簡単で、真のブール値もこの関数に渡すことができます。

これら2つの呼び出しは同種です:

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

明示的なブール変換が必要な場合: sum(bool(x)for x in args)== 1

他のヒント

合計ベースのソリューションは与えられた例には適していると思いますが、Pythonのブール述語は常に評価を短絡することに注意してください。そのため、 allおよびany とより一貫したものを検討する必要があります。

>
def any_one(iterable):
    it = iter(iterable)
    return any(it) and not any(it)
>>> 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
>>>

リンクした質問は、すでに2つの変数の解決策を提供しています。あなたがしなければならないのは、n個の変数で動作するように拡張することです:

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つ以上の入力を持つxorは通常、「1つだけ」ではなくパリティチェッカーなので、only_oneという名前に変更しました。チェッカー。

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

テスト:

>>> 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top