programing

리스트의 이해가 다른 경우

yoursource 2022. 10. 23. 19:49
반응형

리스트의 이해가 다른 경우

지정된 리스트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

반응형