목록 이해 조건의`elif`


129

elif목록 이해에서 사용할 수 있습니까 ?

예 :

l = [1, 2, 3, 4, 5]

for values in l:
    if values==1:
        print 'yes'
    elif values==2:
        print 'no'
    else:
        print 'idle'

elif위 코드와 비슷한 방식으로 목록 이해력에 를 포함 할 수 있습니까 ?

예를 들어 다음과 같은 답변이 있습니다.

['yes', 'no', 'idle', 'idle', 'idle']

지금까지, 나는 단지 사용한 ifelse지능형리스트입니다.

답변:


250

Python의 조건식 은 다음과 같은 사용 사례를 위해 정확히 설계되었습니다.

>>> l = [1, 2, 3, 4, 5]
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]
['yes', 'no', 'idle', 'idle', 'idle']

도움이 되었기를 바랍니다 :-)


5
구문에 흥미로운 역사가 있습니다. 그들이 도입되기까지 수년 동안 "3 차 표현"은 언어에서 가장 많이 요청 된 5 가지 변화 중 하나였습니다. Guido van Rossum은 그것을 명시 적으로 진술 기반 언어로 설계했기 때문에 오랫동안 단호하게 저항했습니다 (3 차 표현, 특히 그들의 남용은 코드에서 많은 모호한 원인이됩니다). 마침내 굴복했을 때 그는 과용을 막는 구문을 의도적으로 선택했다고 발표했습니다. 그럼에도 불구하고 그는 평소처럼 우아한 디자인 작업을했다.
holdenweb

1
Ternary, 젠장 (그는 편집하기에는 너무 늦게 자신의 난독증 실수를 알아 차리고 썼다).
holdenweb

2
이 답변에 찬성표를 던지는 동안 다음과 같이 언급하고 싶습니다. if / else 한 쌍은 읽기 쉽고, 두 쌍은 이해하기 어려워집니다. 3 쌍은 언급하지 마세요. 표현식에 3 개 이상의 쌍이 필요한 경우 사전 또는 별도의 함수를 사용하면 내용을 더 쉽게 읽고 이해할 수 있습니다.
Hai Vu

1
이 문제에 대한 해결책이 아니라 깨끗한 코드를 상기시키고 싶습니다.이 목록 이해에는 세 가지 조건이 있으므로 더 설명적인 방법으로 리팩토링 할 수 있습니다. 내 요점은 이것이다 : martinfowler.com/bliki/FunctionLength.html :)
Alvaro Cavalcanti

나는 elif가 필요한 경우를 우연히 발견했지만 두 가지 값만 있습니다. 이 예를 사용하면 나는 단지 ['yes', 'no']만들어 져야만했을 것 입니다. 이렇게하려면 다음을 수행 할 수 있습니다 ['yes' if v == 1 else 'no' for v in l if values in [1,2]].. 나는 현재 이것을하는 더 깨끗한 방법을 생각할 수 없습니다.
dTanMan

48
>>> d = {1: 'yes', 2: 'no'}
>>> [d.get(x, 'idle') for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

4
이 형식은 목록 comp 내에서 정말 길고 복잡한 if / else 논리를 수행하는 것보다 이해하기 훨씬 쉽다고 생각합니다.
jdi

5
조건부 표현 당신의 취향에되지 않을 수도 있지만 @jdi, 그들은 했다 특히 영업 이익은 요청대로, 핸들 경우-ELIF-의 elif - 다른 체인으로 디자인했다. 그들은 배우기가 어렵지 않으며 사전 조회 로직에 적합하지 않은 상황을 우아하게 처리 할 수 ​​있습니다 'A' if grade>=90 else 'B' if grade>=80 else 'C' if grade>=70 else 'F'.
Raymond Hettinger 2012

1
d이해력 밖에서 정의하는 이점이 있다면 ?
Chris_Rands

내가 목록 이해력이 더 좋은 이유는 그것이 영어처럼 읽기 때문입니다. 프로그래머가 아니더라도 그것이 무엇을하는지 이해할 수있을 것입니다. 이 솔루션을 사용하려면 dict.get () 메서드를 이해해야합니다.
Tim Skov Jacobsen 2018

26

당신은 할 수 있습니다.

다음과 같은 구문을 사용할 때 유의하십시오.

['yes' if v == 1 else 'no' for v in l]

if / else 연산자의 삼항 형식을 사용하고 있습니다 (C와 같은 언어에 익숙하다면 다음 ?:구문과 같습니다 (v == 1 ? 'yes' : 'no'):).

if / else 연산자의 삼항 형식에는 'elif'가 내장되어 있지 않지만 'else'조건에서 시뮬레이션 할 수 있습니다.

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]

이것은 다음과 같습니다.

for v in l:
    if v == 1 :
        print 'yes'
    else:
        if v == 2:
            print 'no'
        else:
            print 'idle'

그래서 당신이 요청한 것과 같은 직접적인 'elif'구조는 없지만 중첩 된 if / else 문으로 시뮬레이션 할 수 있습니다.


1
마지막 단락 코드는 매우 통찰력이 있습니다. 감사합니다!
탈북자


2

목록 이해력을 사용할 수 있으며 원본에서 다른 목록을 만들 것입니다.

>>> l = [1, 2, 3, 4, 5]
>>> result_map = {1: 'yes', 2: 'no'}
>>> [result_map[x] if x in result_map else 'idle' for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

2

또 다른 쉬운 방법은 다음과 같이 조건부 목록 이해를 사용하는 것입니다.

l=[1,2,3,4,5]
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l]

올바른 답변을 제공합니다.

[ 'yes', 'no', 'idle', 'idle', 'idle']

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