여러 변수를 정수와 비교하고 세 글자의 문자열을 출력하는 함수를 만들려고합니다. 이것을 파이썬으로 번역하는 방법이 있는지 궁금합니다. 이렇게 말하십시오 :
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 z
False
숫자가 0이거나 비어있는 ‘truthy’인 첫 번째 인수로 평가합니다 ( 부울 컨텍스트에서 Python이 false로 간주하는 것에 대한 자세한 내용 은 부울 표현식 참조 ).
따라서 가치 x = 2; y = 1; z = 0
, x or y or z
에 해결하는 것 2
즉 인수의 최초의 진정한 같은 값이기 때문입니다. 그런 2 == 1
것 False
, 비록 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 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
답변
매우 게으른 경우 값을 배열 안에 넣을 수 있습니다. 와 같은
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)입니다.