리스트의 이해가 다른 경우
지정된 리스트xs
:
xs = [22, 13, 45, 50, 98, 69, 43, 44, 1]
45보다 큰 숫자는 1을 더하고 45보다 작은 숫자는 5를 더합니다.
>>> xs = [22, 13, 45, 50, 98, 69, 43, 44, 1]
>>> [x+1 if x >= 45 else x+5 for x in xs]
[27, 18, 46, 51, 99, 70, 48, 49, 6]
다음과 같은 경우 작업 수행<condition>
, else - 다른 것을 합니다.
이 오류가 발생하는 이유는 목록 이해 수행 방식과 관련이 있습니다.
다음의 점에 주의해 주세요.
[ expression for item in list if conditional ]
다음과 같습니다.
for item in list:
if conditional:
expression
어디서?expression
는 약간 다른 형식입니다(문장에서 주어와 동사의 순서를 바꾸는 것을 생각해 주세요).
따라서, 당신의 코드는[x+1 for x in l if x >= 45]
다음 작업을 수행합니다.
for x in l:
if x >= 45:
x+1
단, 이 코드는[x+1 if x >= 45 else x+5 for x in l]
이것을 실시합니다(그 후,expression
):
for x in l:
if x>=45: x+1
else: x+5
[x+1 if x >= 45 else x+5 for x in xs]
보상으로, 제가 처음 이 오류를 범했을 때 이것을 기억하기 위해 이렇게 썼습니다.
Python의 조건식은
a if C else b
다음과 같이 사용할 수 없습니다.[a for i in items if C else b]
올바른 형식은 다음과 같습니다.
[a if C else b for i in items]
유효한 형식이 있는 경우에도:
[a for i in items if C]
하지만 그런 식으로 걸러내는 건 달라요
C
단, 다음과 같이 조합할 수 있습니다.[a if tC else b for i in items if fC]
목록 이해의 시작 부분에 표현식을 넣으세요.끝의 if 문은 요소를 필터링합니다!
[x+1 if x >= 45 else x+5 for x in xs]
예를 들어[a if condition1 else b for i in list1 if condition2]
, 2개if
을 가지고 있다condition1
그리고.condition2
두 가지 다른 일을 하는 거죠그 부분(a if condition1 else b)
람다 식에서 가져온 것입니다.
lambda x: a if condition1 else b
다른 한편으로condition2
또 다른 람다입니다.
lambda x: condition2
전체 목록 이해는 다음 항목의 조합으로 간주할 수 있습니다.map
그리고.filter
:
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
목록 이해 내에서 조건식을 대괄호로 묶을 수도 있습니다.
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
print [[x+5,x+1][x >= 45] for x in l]
[false, true][ condition ]는 구문입니다.
저도 비슷한 문제가 있었는데 이 질문과 답변이 정말 유용했어요.제가 헷갈렸던 부분이 있어요.내가 명시적으로 쓴 이유는 실제로 영어로만 말한 사람이 없기 때문이다.
이 반복은 마지막에 진행됩니다.
일반적으로 루프는
for this many times:
if conditional:
do this thing
else:
do something else
모두 목록 이해 부분을 첫 번째 답처럼 간단하게 말합니다.
[ expression for item in list if conditional ]
하지만 이 경우엔 그렇게 하지 않잖아요(그렇게 하려고 했는데)
이 경우 다음과 같습니다.
[ expression if conditional else other thing for this many times ]
조건을 다음과 같이 이동할 수 있습니다.
v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5) for x in v ]
하지만 조금 보기 흉해 보이기 시작했으니 일반 루프를 사용하는 것이 더 나을 수도 있습니다.사용한 것에 주의:v
대신l
리스트 변수가 숫자 1과의 혼동을 줄인다(내 생각에l
그리고.O
어떤 상황에서도 변수 이름으로 사용하지 않도록 해야 합니다(빠르고 빠른 예제 코드에서도 마찬가지).
언급URL : https://stackoverflow.com/questions/4406389/if-else-in-a-list-comprehension
'programing' 카테고리의 다른 글
MariaDb: SELECT에서 파생된 결과를 기반으로 수학적 계산을 찾는 방법 (0) | 2022.10.23 |
---|---|
mariadb-server에서 apt-get 업그레이드가 시간대로 인해 항상 실패함 (0) | 2022.10.23 |
Visual Studio 오류:편집을 위해 저장 프로시저를 로드할 수 없습니다. (0) | 2022.10.23 |
vue 및 laravel API를 사용하여 사용자 세션 데이터를 관리하는 모범 사례 (0) | 2022.10.23 |
Java: 정적 클래스? (0) | 2022.10.23 |