맵, 람다 및 if 조건을 사용하는 한 줄 코드

Nov 22 2020

zip 및 list comprehension을 사용하여 L1의 숫자가 10보다 크고 L2의 숫자가 5보다 작은 경우 두 숫자를 합산하는 새 목록 L3을 만듭니다. 이것은 한 줄의 코드로 수행 할 수 있습니다.

아래 코드를 시도했습니다. 누구든지 파이썬이 왜 불평하는지 설명 할 수 있습니까?

L1 = [1, 5, 2, 16, 32, 3, 54, 8, 100]
L2 = [1, 3, 10, 2, 42, 2, 3, 4, 3]
L3 = map(lambda  (x1,x2): x1 + x2  if(x1 > 10 and x2 < 5)  , zip(L1,L2))
L4 = map(lambda  x: x[0] + x[1]  if(x[0] > 10 and x[1] < 5)  , zip(L1,L2))
print(L3)
print(L4)

답변

BenB Nov 22 2020 at 03:05

보라 여기 : 람다 함수는 반환 값을 가지고 문이 참이 아닌 경우, 아무도 당신이없는 경우해야합니다. 따라서 다음과 같이 else 문을 추가해야합니다.

L4 = map(lambda  x: x[0] + x[1]  if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))

결과

[0, 0, 0, 18, 0, 0, 57, 0, 103]

람다가 더 이상 python 3.x에서 튜플을 풀 수 없기 때문에 첫 번째 시도 (L3)가 작동하지 않습니다 ( 여기 참조 ).

또한 map ()은 객체를 반환하고 그 내용을 인쇄하려면 다음을 호출해야합니다.

print(list(map_object))
# in your case:
print(list(L4))
# or set()

주석을 기반으로 편집 : 한 줄짜리를 원하고 첫 번째 문장이 "using zip and list comprehension"을 말하고 0을 생략하려는 경우이 방법이 작동 할 수 있으며 map 및 lambda보다 쉽습니다.

L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]

지도와 람다 사용을 정말로 고집한다면 2를 편집하십시오.

L4 = map(lambda  x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
2 wjandrea Nov 22 2020 at 03:42

이것은 XY 문제 입니다. 목록 이해를 요구할 때지도를 사용하고 있습니다. 본질적으로 맵이 아닌 필터를 요구합니다.

>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]

기능적인 스타일로 할 수는 있지만 너무 못 생겼습니다. 이러지마

L3 = list(map(
    lambda t: t[0]+t[1],
    filter(
        lambda t: t[0]>10 and t[1]<5,
        zip(L1, L2)
        )
    ))
print(L3)  # -> [18, 57, 103]