2012-01-06 3 views
2

이 사이트에서 다른 사람으로부터 팁을 주면서, 나는 논리적 연산자를 사용하여 if 문과 함께 for 루프를 사용하는 지름길로서리스트 이해에서 조건 논리를 표현 해왔다.0과 파이썬 논리 연산자를 사용하여 문제가

예를 들어 [[예, 아니요], [아니요], [예], [예]로 바꾸고 싶은 목록 [1, 0, 0, 1, 1] 나는 이것을 다음과 같이 할 수있다 :

original = [1, 0, 0, 1, 1] 
new = [((x==1) and "Yes") or "No" for x in original] 

문제는 내가 이런 식으로 0을 가진 논리 연산자를 사용할 때 매우 이상한 결과를 얻는다는 것이다. 결과는 목록 이해력을 사용하는지 여부에 관계없이 발생합니다.

이 :

print((True and 1.0) or "Wrong") 
print((True and -1.0) or "Wrong") 
print((True and "1.0") or "Wrong") 
print((True and 1) or "Wrong") 

올바르게 (내가 생각하는) 출력 :

그러나
1.0 
-1.0 
1.0 
1 

이 :

print((True and 0) or "Wrong") 
print((True and 0.0) or "Wrong") 

출력 :

Wrong 
Wrong 
,536,

파이썬이 0과 0.0을 모두 False로 변환하고 다른 모든 다른 값을 True로 변환한다고 생각합니다.

a. 이 경우 및/또는 b. 크리스 (A 람다 또는 뭔가) 지능형리스트에서 난 후 어떤 다른 방법을 달성

많은 감사하는 방법이

+1

에서 발췌. – Amber

+0

''0''과 당신이 원하는대로 작동하지 않는 논리 연산자로 무엇을하려고하는지 실제로 이해하지 못합니다. 물론 "샘플"코드는 정상적으로 작동합니다. 원하는 것을하지 않는 샘플을 제공 할 수 있습니까? –

답변

5

0 당신이 할 수있는 (당신의 단락 회로 평가에 거짓을 반환 bool(0)을 통해 테스트하여 false을 반환합니다. 거짓, 없음, 숫자 모든 유형, 문자열, 튜플,리스트, 사전, 세트 포함 빈 문자열 및 컨테이너 (의 제로 :

new = ["yes" if x else "no" for x in list] 
+4

예. 'a b else c' 구조는 여기서 일하기에 더 좋은 도구입니다. – Amber

+0

앰버 감사합니다! 내 대답을 업데이트했습니다. 이것은 훨씬 명확합니다. 편집 : 죄송합니다. –

+1

고마워요. 당신이 그걸 할 수 있는지 모르 셨습니다. –

1

다음 값이 거짓으로 해석됩니다 :이 훨씬 간단하다 생각 frozensets). 다른 모든 값은 true로 해석됩니다. (이 설정을 변경하는 방법에 대한 제로() 특별한 방법을 참조하십시오.)

그냥 삼항` 경우 다른 `인라인 구문을 사용 http://docs.python.org/reference/expressions.html#boolean-operations

+0

고마워요 .- 지금 내 질문에 모두 대답했습니다. :) –

관련 문제