값에 대해 여러 변수를 테스트하는 방법

python if-statement comparison match boolean-logic


여러 변수를 정수와 비교하고 세 글자의 문자열을 출력하는 함수를 만들려고합니다. 이것을 파이썬으로 번역하는 방법이 있는지 궁금합니다. 이렇게 말하십시오 :

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0 :
    mylist.append("c")
if x or y or z == 1 :
    mylist.append("d")
if x or y or z == 2 :
    mylist.append("e")
if x or y or z == 3 : 
    mylist.append("f")

어떤 목록을 반환합니다

["c", "d", "f"]

이와 같은 것이 가능합니까?





Answer 1 Martijn Pieters


부울 표현식의 작동 방식을 오해합니다. 그들은 영어 문장처럼 작동하지 않으며 여기에서 모든 이름에 대해 동일한 비교에 대해 이야기하고 있다고 생각합니다. 당신이 찾고있는:

if x == 1 or y == 1 or z == 1:

xy 는 자체적으로 평가됩니다 ( 0 이면 False , 그렇지 않으면 True ).

튜플 에 대해 포함 테스트를 사용하면 단축 할 수 있습니다.

if 1 in (x, y, z):

또는 더 나은 방법 :

if 1 in {x, y, z}:

고정 비용 멤버쉽 테스트를 활용하기 위해 set 사용 (왼쪽 피연산자에 관계없이 고정 된 시간이 걸립니다).

또는를 사용하면 파이썬은 연산자의 각면을 별도의 표현식으로 간주합니다. x or y == 1 표현식은 먼저 x 에 대한 부울 테스트로 처리 된 다음 False 인 경우 y == 1 표현식이 테스트됩니다.

이는 운영자 우선 순위 때문 입니다. or 연산자는 == 테스트보다 우선 순위가 낮으므로 후자가 먼저 평가됩니다.

그러나 이것이 사실이 아니고 표현식 x or y or z == 1 이 실제로 (x or y or z) == 1 로 해석 된 경우에도 예상 한대로 수행되지 않습니다.

x or y or z 는 'truthy'인 첫 번째 인수 (예 : False , 숫자 0 또는 비어 있지 않음)로 평가됩니다 (부울 컨텍스트에서 Python이 false로 간주하는 항목에 대한 자세한 내용은 부울 표현식 참조).

따라서 값 x = 2; y = 1; z = 0 y = 1; z = 0 , x or y or z2 로 해석됩니다. 이는 인수에서 첫 번째와 같은 값이기 때문입니다. y == 1True 일지라도 2 == 1False 입니다.

반대의 경우도 마찬가지입니다. 단일 변수에 대해 여러 값을 테스트하는 단계; x == 1 or 2 or 3 은 같은 이유로 실패합니다. x in {1, 2, 3} x == 1 or x == 2 or x == 3 또는 x를 사용하십시오 .




Answer 2 dansalmo


다음과 같은 사전 구조로 문제를보다 쉽게 ​​해결할 수 있습니다.

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]



Answer 3 ThatGuyRussell


Martijn Pieters가 말했듯이 정확하고 빠른 형식은 다음과 같습니다.

if 1 in {x, y, z}:

그의 조언을 사용하면 이제는 별도의 if 문을 가지므로 Python은 전자가 True 인지 False 인지 각 문장을 읽습니다. 같은 :

if 0 in {x, y, z}:
    mylist.append("c")
if 1 in {x, y, z}:
    mylist.append("d")
if 2 in {x, y, z}:
    mylist.append("e")
...

이것은 효과가 있지만 사전을 사용하는 것이 편한 경우 (내가 한 일을 참조하십시오) 숫자를 원하는 문자에 매핑 한 다음 for-loop를 사용하여 초기 사전을 만들어 정리할 수 있습니다.

num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
    if number in {x, y, z}:
        mylist.append(num_to_letters[number])



Answer 4 akaRem


x or y or z == 0 을 쓰는 직접적인 방법은

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

그러나 나는 당신이 그것을 좋아한다고 생각하지 않습니다. :) 그리고이 방법은 못생긴입니다.

다른 방법 (더 나은)은 다음과 같습니다.

0 in (x, y, z)

BTW 많은 if s를 다음과 같이 쓸 수 있습니다.

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break



Answer 5 ytpillai


매우 게으른 경우 값을 배열 안에 넣을 수 있습니다. 와 같은

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

숫자와 문자를 사전에 넣어서 할 수도 있지만 이것은 아마도 if 문보다 훨씬 복잡 할 것입니다. 그것은 당신이 여분의 게 으르려고 노력하면서 얻는 것입니다 :)

한가지 더

if x or y or z == 0:

컴파일하지만 원하는 방식으로 컴파일하지는 않습니다. if 문에 변수를 넣을 때 (예)

if b

프로그램은 변수가 null이 아닌지 확인합니다. 위의 진술을 작성하는 또 다른 방법은 (더 의미가 있습니다)

if bool(b)

Bool은 기본적으로 boolean 문을 확인하는 명령을 수행하는 Python의 기본 제공 함수입니다 (무엇이 무엇인지 모르는 경우 if 문에서 바로 만들려고합니다 :))

내가 찾은 또 다른 게으른 방법은 다음과 같습니다.

if any([x==0, y==0, z==0])