[python] 값에 대해 여러 변수를 테스트하는 방법은 무엇입니까?

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

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

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



답변

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

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

x그리고 y그렇지 않으면 (스스로 평가 False하는 경우 0, True기타).

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

if 1 in (x, y, z):

또는 더 나은 방법 :

if 1 in {x, y, z}:

aset 를 사용하여 일정 비용 멤버쉽 테스트를 활용하십시오 ( in왼쪽 피연산자가 무엇이든 고정 된 시간이 걸립니다).

을 사용 or하면 파이썬은 연산자의 각면을 별도의 표현식 으로 간주 합니다. 표현식 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 zFalse숫자가 0이거나 비어있는 ‘truthy’인 첫 번째 인수로 평가합니다 ( 부울 컨텍스트에서 Python이 false로 간주하는 것에 대한 자세한 내용 은 부울 표현식 참조 ).

따라서 가치 x = 2; y = 1; z = 0 , x or y or z에 해결하는 것 2즉 인수의 최초의 진정한 같은 값이기 때문입니다. 그런 2 == 1False, 비록 y == 1것이다 True.

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


답변

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

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


답변

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

if 1 in {x, y, z}:

지금 전이었다 여부를 파이썬 각 문장을 읽을 것을 별도의 경우 명령문 그렇게했을 그의 조언을 사용 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 루프를 사용하여 초기 사전을 만들어 정리할 수 있습니다.

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


답변

직접 쓰는 방법 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 ifs는 다음과 같이 쓸 수 있습니다.

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


답변

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

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


답변

변수 집합 내에 값이 포함되어 있는지 확인하려면 내장 모듈 itertools및을 사용할 수 있습니다 operator.

예를 들면 다음과 같습니다.

수입품 :

from itertools import repeat
from operator import contains

변수 선언 :

x = 0
y = 1
z = 3

확인하려는 순서대로 값의 맵핑을 작성하십시오.

check_values = (0, 1, 3)

itertools변수 반복을 허용하는 데 사용하십시오 .

check_vars = repeat((x, y, z))

마지막으로 map함수를 사용하여 반복자를 만듭니다.

checker = map(contains, check_vars, check_values)

그런 다음 원래 순서대로 값을 확인할 때 다음을 사용하십시오 next().

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

기타…

내장 모듈 lambda x: x in (variables)이기 때문에 operator사용하는 것보다 빠르고 효율적 이기 때문에 이점이 있습니다.lambda 사용자 정의 위치 내 기능을 작성하는 .

목록에 0이 아닌 값 (또는 False)이 있는지 확인하는 또 다른 옵션 :

not (x and y and z)

동등한:

not all((x, y, z))


답변

변수를 주문하기 때문에 여기에 목표가있는 것 같습니다. {z,y,x}{0,1,3}매개 변수의 어떤 순서.

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

이런 식으로 전체 솔루션은 O (n)입니다.