한 줄 목록 이해 : if-else 변형


178

파이썬 목록 이해 구문에 대한 자세한 내용입니다. 주어진 범위의 홀수 목록을 생성하는 목록 이해가 있습니다.

[x for x in range(1, 10) if x % 2]

필터가 만들어집니다-짝수 ( if x % 2)를 제거하는 소스 목록이 있습니다. if-then-else와 같은 것을 사용하고 싶습니다. 다음 코드는 실패합니다 :

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

if-else와 같은 파이썬 표현식이 있습니다.

1 if 0 is 0 else 3

목록 이해 내에서 사용하는 방법?


1
가치가있는 것은, 발전기가 아니라 "목록 이해력"을 가지고 있다는 것입니다. 궁극적 인 구문은 생성기가 ()대신 대신 사용한다는 점을 제외하면 동일 []합니다.
mgilson 2016 년


2
그것은 이유를 얻을 걸 렸어요 if x % 2 을 제거해 도 숫자 (대신 그들을 유지의) -이 경우 때문에 x심지어이다 x % 2발현 결과 0, 어떤 차례에서, 평가하여 False, 어떤 동안 int을 제외하고 0평가 True.

답변:


328

x if y else z각 요소에 대해 반환하는 표현식의 구문입니다. 따라서 다음이 필요합니다.

[ x if x%2 else x*100 for x in range(1, 10) ]

혼동은 첫 번째 예에서는 필터 를 사용 하지만 두 번째 예에서는 필터 를 사용하지 않는다는 사실에서 발생합니다 . 두 번째 예에서는 삼항 연산자 식을 사용하여 각 값을 다른 값 에만 매핑 합니다.

필터를 사용하려면 다음이 필요합니다.

[ EXP for x in seq if COND ]

필터가 없으면 다음이 필요합니다.

[ EXP for x in seq ]

두 번째 예에서 표현은 "복잡한"표현으로, 이에는 if-else.


2
하나의 질문이 있습니다 ... [x for x in range(1, 10) if x % 2]올바른 구문입니다. [x if x % 2 for x in range(1, 10)]-이것은 아니지만 [x if x%2 else x*100 for x in range(1, 10)]올바른 구문입니다. 어떻게 오세요?
ducin

두 번째 예에서 @tkoomzaaskz, 이것은 삼항-다른 연산자 ( else)가 아닌 필터도 아닙니다 ( EXP목록 이해 의 일부 이기 때문에 )
shx2

3
@tkoomzaaskz 더 명확히하기 위해 if끝에 두 번째 를 추가 할 수 있습니다 [x if x%2 else x*100 for x in range(1, 10) if not x%3]. 첫 번째 if는 삼항 연산자의 if일부이고 두 번째 는 목록 이해 구문의 일부입니다. 전체 x if x%2 else x*100는 단순함 2*x과 "동일한 수준" 이며 for, 필터링 if not x%3이 이미 수행 된 경우의 왼쪽에서 평가되는 표현식 입니다.
zx81

안녕하세요, 한 줄로 된 문장이 for i in x:for 루프에서와 같이 두 줄로 만드는 것보다 성능이 if i == y:좋습니까?
Alexis.Rolland


12

목록 이해를 통해 그렇게 할 수 있습니다.

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

1
아주 좋아요 부울 슬라이스. 고맙게도 방금 읽기 쉬운 솔루션을 제공했습니다.

A, B = [10,11] [a == 19], [1,14] [a == 20]
Stefan Gruenwald

10

또 다른 해결책은 누군가가 좋아할 수 있기를 바랍니다.

사용 : [거짓, 참] [식]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

3

나는 이것을 할 수 있었다

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.