변수 목록에서 하나의 변수 만 설정되었는지 확인하십시오.

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

  •  06-07-2019
  •  | 
  •  

문제

변수 목록에 하나의 변수만이 실제 값인지 확인하는 간단한 방법을 찾고 있습니다. 나는 이것을 보았다 논리적 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는 평범한 정수의 하위 유형이기 때문에"(원천) 정수 목록을 아주 쉽게 요약 할 수 있으며이 기능에도 진정한 부울을 전달할 수도 있습니다.

그래서이 두 호출은 균질합니다.

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

명백한 부울 전환을 원한다면 : sum( bool(x) for x in args ) == 1.

다른 팁

합산 기반 솔루션은 주어진 예제에 대해 적합하다고 생각하지만 부울은 파이썬에서 항상 그들의 평가를 단락 시킨다는 것을 명심하십시오. 그래서 당신은 더 일치하는 것을 고려하고 싶을 것입니다. 모두와 다른.

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
>>>

당신이 연결 한 질문은 이미 두 변수에 대한 솔루션을 제공합니다. 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

내 간단한 접근 방식은 다음과 같습니다. 하나 이상의 입력을 가진 xor가 일반적으로 "하나의"체커가 아닌 패리티 체커이기 때문에 이름을 바꿉니다.

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