파이썬 삼항 연산자없이


82

파이썬에서 한 줄로 할 수 있습니까?

if <condition>:
    myList.append('myString')

삼항 연산자를 시도했습니다.

myList.append('myString' if <condition>)

하지만 내 IDE ( MyEclipse )는 else.


세 부분이없는 삼항 연산자 같은 건가요? 이것은 측면에서 모순되지 않습니까?
론 후작

답변:


115

예, 다음과 같이 할 수 있습니다.

<condition> and myList.append('myString')

경우 <condition>거짓, 다음에 시작된다 단락과 오른쪽은 평가되지 않습니다. 경우 <condition>에 해당하고, 그 오른쪽이 평가되고 요소가 추가된다.

위의 작업을하는 것이 비단뱀 적이 지 않다는 점을 지적 할 것이며, 이에 관계없이 이것을 작성하는 것이 가장 좋습니다.

if <condition>: myList.append('myString')

데모:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']

9
이 답변은 기술적으로 정확하지만 좋은 프로그래밍 관행은 아닙니다. Python은 쉽게 읽을 수있는 언어를 목표로하기 때문에이 코드는 Python이 아닌 것으로 간주됩니다.
Mr. Lance E Sloan

9
@LS : 동의합니다. 그렇기 때문에 if 문을 사용하는 것이 가장 좋을 것이라고 말했습니다. 그러나 나는 그것을 더 명확하게하기 위해 대답을 약간 수정했습니다.
Claudiu

2
fyi 두 번째 예제는 pep8 검사에 실패 할 것입니다 : E701 multiple statements on one line그래서 파이썬이 아닙니다 ...;)
Cas

1
@hard_working_ant이 경우 "올바른"방법이 될 것 x = object.get('attribute')입니다
wihlke

1
@wihlke : yes 및 추가 x = object.get ( 'attribute', None)을 기본값으로 None으로 추가
hard_working_ant

43

언어가 구문 사용을 허용하지 않는 이유

variable = "something" if a_condition

하지 않고는 else경우 여기서,이다 a_condition == False, variable갑자기 알 수 없습니다. 기본값은 None이지만 Python은 모든 변수 할당이 실제로 명시 적 할당을 생성하도록 요구합니다. 이는 함수 호출과 같은 경우에도 적용됩니다. 함수에 전달 된 값 은 할당 문의 RHS 와 같이 평가 되기 때문입니다.

마찬가지로, 모든는 return조건부라고해도 실제로 반환해야합니다 return. 예 :

return variable if a_condition

허용되지 않지만

return variable if a_condition else None

두 번째 예제는 명시 적으로 무언가를 반환하도록 보장되기 때문에 허용됩니다.


1
파이썬이 이것을 사용하는 것을 허용하지 않아서 변수가 아직 variable=None완벽하게 합법적 이지 않도록하는 것은 아이러니합니다 . : D
가이

1
하지만 다음과 같이 사용하고 싶었습니다 continue if i == 0. for 루프에서.
karantan 2015 년

2
당신은 할 수 있습니다else pass?
OldBunny2800

5
else pass삼항 표현식이에 전달할 수있는 값을 반환해야하기 때문에 작동하지 않습니다 return. pass유효한 return값 이 아닙니다 .
Emmett Butler

4
나는이 동기가 주어진, 진짜 이유는 것을 동의하지 않는 if a_condition: variable = "something"if a_condition: return variable법적 있습니다. 따라서 본질적으로 파이썬의 임의의 구문 선택입니다.
oulenz

13
if <condition>: myList.append('myString')

그렇지 않으면 아닙니다. 한 줄에 넣어야하는 이유는 무엇입니까?

"삼항 연산자"는 연산자 입니다. 다른 연산자와 마찬가지로 무언가를 반환해야 하므로 else절 없이 삼항 연산자를 어떻게 가질 수 있습니까? 조건이 사실과 같지 않으면 무엇을 반환해야합니까?


10

기본적으로 구성을 요청합니다 do_thing() if <condition> else pass( SyntaxError실행 되면을 던질 것입니다 ). 내가 연구하는 동안 (다소) 비슷한 질문 do_thing() if condition else None 이 당신이 얻을 수있는 한 가깝다 는 것을 발견했듯이 (이것은 단지 할 수있는 또 다른 방법입니다 <condition> and do_thing()). 따라서이 아이디어와 다른 답변을 요약하면 다음과 같은 옵션이 있습니다.

  • if <condition>: myList.append('myString') — '해키'가 가장 적은 (따라서 선호되는) 방법 인 것 같습니다.
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

해키가 가장 적은 방법은 작동하지 않습니다. 적어도 REPL에는 없습니다-구문 오류가 발생합니다. 같은 줄의 선행 코드로 인해 발생한 것 같습니다. 대신 자체 행에서 실행해야합니다. 그러나 그럼에도 불구하고 생략 부호를 건너 뛰려면 사용자 입력이 필요합니다.
Unknow0059

3

myList.extend(['myString'] if condition else []) 다른 솔루션보다 더 많은 작업이지만 작동합니다.


0

다음과 같이 할 수 있습니다.

myList.append('myString') if <condition> else False

또는

myList.append('myString') if <condition> else 0

False 및 0은 목록에 추가되지 않습니다. 조건이 충족되지 않으면 라인이 무언가를 반환하면됩니다. 0 또는 False를 None 또는 빈 문자열 또는 원하는대로 바꿀 수 있으며 목록에 영향을주지 않습니다.
Zachary Chiodini

당시 제 생각은 목록 이해의 경우였습니다. 내 댓글을 삭제했습니다. 반대표는 제가 아닙니다. 나는 더 깨끗한 방법이 될 것이라고 생각합니다. myList.append('myString') if True else _그러나 당신이 아무것도 할당하지 않는다면, 중요하지 않습니다. 나는이 사람이 비슷한 논리로 목록을 이해하려고 시도하는 것에 대해 걱정하고 있습니다.
Dave Liu

0

조건에 따라 목록에 선택적 요소를 추가하려면이 작업을 수행합니다.

nums = [
        1,
        2,
        3 if <condition> else None,
        4,
       ]
nums = [i for i in nums if i is not None]

조건이 충족되지 않으면 값을 None으로 바꾼 다음 나중에 None Values없이 목록을 재정의합니다. 이런 식으로 조건이 충족되면 색인을 보존합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.