source

리스트 이해와 맵

lovecheck 2022. 10. 19. 21:13
반응형

리스트 이해와 맵

를 사용하는 것을 선호하는 이유가 있습니까?map()목록 이해도를 초과하거나 그 반대입니까?둘 중 어느 쪽이 일반적으로 다른 쪽보다 더 효율적이거나 일반적으로 더 버마적인 것으로 간주됩니까?

map경우에 따라서는 현미경적으로 더 빠를 수 있습니다(목적으로 람다를 만드는 것이 아니라 지도와 리스트콤에서 동일한 함수를 사용하는 경우).목록 수집은 다른 경우 더 빠를 수 있으며, 대부분의 파이토니스타는 목록 수집을 더 직접적이고 명확하게 간주합니다.

동일한 기능을 사용하는 경우 맵의 작은 속도 이점을 보여주는 예:

$ python -m timeit -s'xs=range(10)' 'map(hex, xs)'
100000 loops, best of 3: 4.86 usec per loop
$ python -m timeit -s'xs=range(10)' '[hex(x) for x in xs]'
100000 loops, best of 3: 5.58 usec per loop

지도에 람다가 필요한 경우 성능 비교가 완전히 역전되는 예를 보여 줍니다.

$ python -m timeit -s'xs=range(10)' 'map(lambda x: x+2, xs)'
100000 loops, best of 3: 4.24 usec per loop
$ python -m timeit -s'xs=range(10)' '[x+2 for x in xs]'
100000 loops, best of 3: 2.32 usec per loop

경우들

  • 일반적인 경우:거의 항상 python의 목록 이해를 사용하고 싶을 것입니다. 왜냐하면 코드를 읽는 초보 프로그래머에게 당신이 하고 있는 일이 더 명확해지기 때문입니다.(다른 관용어가 적용될 수 있는 다른 언어에는 적용되지 않습니다.)python 프로그래머에게 무엇을 하고 있는지는 더욱 명확해질 것입니다.목록 압축은 python의 반복에 대한 사실상의 표준이기 때문입니다.그것들은 기대되고 있습니다.
  • 흔한 경우:그러나 함수가 이미 정의되어 있는 경우에는 대부분의 경우 이 기능을 사용하는 것이 합리적입니다.map하지만, 이것은 '음속적'으로 여겨집니다.를 들어, 「」라고 하는 것은,map(sum, myLists)우아하다/[sum(x) for x in myLists]. 변수)를 구성할 가 없는 우아함을 수 있습니다sum(x) for x... ★★★★★★★★★★★★★★★★★」sum(_) for _... ★★★★★★★★★★★★★★★★★」sum(readableName) for readableName...를 두 번 눌러야 합니다. filter ★★★★★★★★★★★★★★★★★」reduce 그 중 itertools 몇 프로그래밍을 할 수 . 크게 .코드의 가독성은 코멘트에 크게 좌우됩니다.
  • 거의 없음:를 사용할 수 있습니다.mapmap 카레링(Currying)map ""에 대해 이야기하는 것이 map에서는 Haskell이라고 하는 있습니다.fmap는 모든 데이터 구조에서의 매핑을 일반화합니다.비단뱀 왜냐하면 python 문법은 반복에 대해 말하기 위해 generator-style을 사용하도록 강요하기 때문입니다. 나쁠 때도 있다(이것이 좋을 때도 있고 나쁠 때도 있습니다.)은 아마도 들 수 이다.map(f, *lists)이치에 맞는 일이라고 생각합니다.가 생각할 수 가장 는 '예'입니다.sumEach = partial(map,sum)이는 대략 다음과 같은 단일 라이너입니다.

def sumEach(myLists):
    return [sum(_) for _ in myLists]
  • -루프만 사용:물론 for-loop을 사용할 수도 있습니다.기능 프로그래밍의 관점에서는 우아하지 않지만, 파이썬과 같은 필수 프로그래밍 언어에서 로컬 변수가 아닌 경우 코드를 더 명확하게 만들 수 있습니다. 왜냐하면 사람들은 코드를 읽는 데 매우 익숙하기 때문입니다.for-loops는 일반적으로 목록 통합이나 맵이 최적화되어 있는 등 목록을 작성하지 않는 복잡한 작업을 수행할 때 가장 효율적입니다(예를 들어, 합산이나 트리 만들기 등). 적어도 메모리 측면에서는 효율적입니다(시간 측면에서는 반드시 최악의 상수 계수를 예상할 수 없습니다).희귀한 병리학적 가비지 수집 딸꾹질).

"피톤주의"

나는 피토닉이라는 단어를 싫어한다. 왜냐하면 피토닉이 내 눈에 항상 우아한 것은 아니기 때문이다.그럼에도 불구하고,map ★★★★★★★★★★★★★★★★★」filter한 기능 유용한 등)itertoolsmodule modulemodule)은 스타일 인 것으로 될 수 있습니다.

게으름

효율성 측면에서 보면, 대부분의 기능적 프로그래밍 구조와 마찬가지로, MAP은 게으를 수 있으며, 실제로는 python에서 게으를 수 있습니다.즉, (python3에서) 이렇게 하면 컴퓨터의 메모리가 부족하지 않고 저장되지 않은 데이터가 모두 손실되지 않습니다.

>>> map(str, range(10**100))
<map object at 0x2201d50>

목록 이해로 이것을 시도해 보십시오.

>>> [str(n) for n in range(10**100)]
# DO NOT TRY THIS AT HOME OR YOU WILL BE SAD #

목록 압축도 본질적으로 느리지만 python은 이를 non-lazy로 구현하기로 했습니다.그러나 python은 다음과 같이 생성기 식 형식의 느린 목록 통합을 지원합니다.

>>> (str(n) for n in range(10**100))
<generator object <genexpr> at 0xacbdef>

으로는 이렇게 생각하시면 .[...](예: 구문입니다.list(x for x in range(5)).

간단한 예시

from operator import neg
print({x:x**2 for x in map(neg,range(5))})

print({x:x**2 for x in [-y for y in range(5)]})

print({x:x**2 for x in (-y for y in range(5))})

목록 압축은 느슨하지 않으므로 생성기 압축을 사용하지 않는 한 더 많은 메모리가 필요할 수 있습니다. 괄호 '''[...]특히 괄호가 뒤죽박죽일 때는 더더욱 명백해진다..[x for x in...반복기 변수를 짧게 유지하는 한 코드를 들여쓰지 않으면 목록 압축이 더 명확해집니다.하지만 언제든지 암호를 입력할 수 있습니다.

print(
    {x:x**2 for x in (-y for y in range(5))}
)

또는 해체할 수도 있습니다.

rangeNeg5 = (-y for y in range(5))
print(
    {x:x**2 for x in rangeNeg5}
)

python3의 효율성 비교

map★★★★★★★★★★★★★★★★★:

% python3 -mtimeit -s 'xs=range(1000)' 'f=lambda x:x' 'z=map(f,xs)'
1000000 loops, best of 3: 0.336 usec per loop            ^^^^^^^^^

모든 알 수mappython3(및 python2 또는 python3의 제너레이터 표현식)에서는 필요한 마지막 순간까지 값이 계산되지 않습니다., 은, 「 」, 「 」, 「 」, 「 」를 사용하는 경우의 오버헤드를 .map이라는 점입니다 제너레이터 은 python 제너레이터의 할 수 에 python 제너레이터의 장점은 에서 오른쪽으로 .이치노x[0], x[1], x[2], ....

놓은 칩시다.f하고 싶다mapmap 평가를 list(...)매우 흥미로운 결과를 얻을 수 있습니다.

% python3 -mtimeit -s 'xs=range(1000)' 'f=lambda x:x' 'z=list(map(f,xs))'                                                                                                                                                
10000 loops, best of 3: 165/124/135 usec per loop        ^^^^^^^^^^^^^^^
                    for list(<map object>)

% python3 -mtimeit -s 'xs=range(1000)' 'f=lambda x:x' 'z=[f(x) for x in xs]'                                                                                                                                      
10000 loops, best of 3: 181/118/123 usec per loop        ^^^^^^^^^^^^^^^^^^
                    for list(<generator>), probably optimized

% python3 -mtimeit -s 'xs=range(1000)' 'f=lambda x:x' 'z=list(f(x) for x in xs)'                                                                                                                                    
1000 loops, best of 3: 215/150/150 usec per loop         ^^^^^^^^^^^^^^^^^^^^^^
                    for list(<generator>)

"AAA/BBB/CC" "A" python 3 。를 탑재한 2010년 경의 인텔 워크스테이션에서 수행되었으며, B와 C는 python 3.2.1을 탑재한 2013년 경의 AMD 워크스테이션에서 수행되었으며, 하드웨어는 매우 다릅니다.그 결과 맵과 리스트의 통합은 퍼포먼스에서 동등하게 되어 다른 랜덤 요인에 의해 가장 큰 영향을 받습니다.알 수 은 리스트의 포괄성을 리스트의 포괄성을 예상하는 것입니다.[...] 식보다 (...),map또한 제너레이터 식보다 효율적입니다(모든 값이 평가/사용되는 것으로 가정).

이러한 테스트는 매우 단순한 함수(식별 함수)를 가정하고 있다는 것을 인식하는 것이 중요합니다.다만, 이 함수가 복잡하면 프로그램의 다른 요소에 비해 퍼포먼스 오버헤드는 무시할 수 있기 때문에 괜찮습니다.(다음과 같은 간단한 방법으로 테스트하는 것은 여전히 흥미로울 수 있습니다.f=lambda x:x+x)

사람이라면 할 수 .dis모듈을 통해 실제로 배후에서 무슨 일이 일어나고 있는지 확인합니다.

>>> listComp = compile('[f(x) for x in xs]', 'listComp', 'eval')
>>> dis.dis(listComp)
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x2511a48, file "listComp", line 1>) 
              3 MAKE_FUNCTION            0 
              6 LOAD_NAME                0 (xs) 
              9 GET_ITER             
             10 CALL_FUNCTION            1 
             13 RETURN_VALUE         
>>> listComp.co_consts
(<code object <listcomp> at 0x2511a48, file "listComp", line 1>,)
>>> dis.dis(listComp.co_consts[0])
  1           0 BUILD_LIST               0 
              3 LOAD_FAST                0 (.0) 
        >>    6 FOR_ITER                18 (to 27) 
              9 STORE_FAST               1 (x) 
             12 LOAD_GLOBAL              0 (f) 
             15 LOAD_FAST                1 (x) 
             18 CALL_FUNCTION            1 
             21 LIST_APPEND              2 
             24 JUMP_ABSOLUTE            6 
        >>   27 RETURN_VALUE

 

>>> listComp2 = compile('list(f(x) for x in xs)', 'listComp2', 'eval')
>>> dis.dis(listComp2)
  1           0 LOAD_NAME                0 (list) 
              3 LOAD_CONST               0 (<code object <genexpr> at 0x255bc68, file "listComp2", line 1>) 
              6 MAKE_FUNCTION            0 
              9 LOAD_NAME                1 (xs) 
             12 GET_ITER             
             13 CALL_FUNCTION            1 
             16 CALL_FUNCTION            1 
             19 RETURN_VALUE         
>>> listComp2.co_consts
(<code object <genexpr> at 0x255bc68, file "listComp2", line 1>,)
>>> dis.dis(listComp2.co_consts[0])
  1           0 LOAD_FAST                0 (.0) 
        >>    3 FOR_ITER                17 (to 23) 
              6 STORE_FAST               1 (x) 
              9 LOAD_GLOBAL              0 (f) 
             12 LOAD_FAST                1 (x) 
             15 CALL_FUNCTION            1 
             18 YIELD_VALUE          
             19 POP_TOP              
             20 JUMP_ABSOLUTE            3 
        >>   23 LOAD_CONST               0 (None) 
             26 RETURN_VALUE

 

>>> evalledMap = compile('list(map(f,xs))', 'evalledMap', 'eval')
>>> dis.dis(evalledMap)
  1           0 LOAD_NAME                0 (list) 
              3 LOAD_NAME                1 (map) 
              6 LOAD_NAME                2 (f) 
              9 LOAD_NAME                3 (xs) 
             12 CALL_FUNCTION            2 
             15 CALL_FUNCTION            1 
             18 RETURN_VALUE 

쓰는 게 것 요.[...]이 '보다 크다'보다 크다list(...)도 그map분해하기에는 클래스가 좀 불투명하지만 속도 테스트를 통해 충분히 알 수 있습니다.

Python 2: Python 2: Python 2: Python 해야 합니다.map ★★★★★★★★★★★★★★★★★」filter리스트 컴포넌트 대신.

"Pythonic"이 아니더라도 이들을 선호해야 하는 객관적인 이유는 다음과 같습니다.
인수로서 함수/lambda가 필요하며, 이를 통해 새로운 범위가 도입됩니다.

한 번 이상 물린 적이 있어요.

for x, y in somePoints:
    # (several lines of code here)
    squared = [x ** 2 for x in numbers]
    # Oops, x was silently overwritten!

하지만 내가 대신 말했더라면:

for x, y in somePoints:
    # (several lines of code here)
    squared = map(lambda x: x ** 2, numbers)

그럼 모든 게 잘 됐을 거야

같은 범위에서 같은 변수 이름을 사용하는 것은 바보 같은 짓이라고 할 수 있습니다.

나는 그렇지 않았다.두 개의 코드입니다.x는 같은 범위에 있지 않습니다.
내부 블록을 코드의 다른 섹션으로 이동한 후에야 문제가 발생했습니다(개발이 아닌 유지보수 중 문제 읽기). 예상하지 못했습니다.

, 만약 당신이 이 실수를 하지 않는다면, 리스트의 이해가 더 우아해 질 것입니다.
하지만 개인적인 경험(그리고 다른 사람들이 같은 실수를 하는 것을 보아서)이러한 버그가 당신의 코드에 몰래 들어갔을 때 겪어야 할 고통은 가치가 없다고 생각할 만큼 충분히 많은 것을 보았습니다.

결론:

map ★★★★★★★★★★★★★★★★★」filter스코프 관련의 미묘한 버그를 방지합니다.

사이드 노트:

바랍니다.imap ★★★★★★★★★★★★★★★★★」ifilter)itertools가합니다.가 고객의 상황에 적합한지 확인합니다.

로로 actually actually actually actually.map파이썬 3를 소개합니다.파이톤3

def square(x):
    return x*x
squares = map(square, [1, 2, 3])
print(list(squares))
print(list(squares))

「4라고 하는 2회 할 수 만, 그 1 하는 행 뒤에 「1, 4, 9」라고 하는 「1, 4, 9」가 인쇄됩니다squares3개의 요소로 이루어진 시퀀스로 동작하는 것처럼 보이지만, 두 번째는 빈 요소로 동작합니다.

2 에서는 Python 2 map는 목록 컴파일레이션이 양쪽 언어에서 수행하는 것과 마찬가지로 일반 오래된 목록을 반환합니다.이다.map3 (및 Python 3 (»))의 imapPython 2) python python python python python python python python python python python python python.복기입입니니다

리스트에서 반복할 때와 달리 반복기에서 반복할 때 요소가 소비됩니다. ★★★★★squaresprint(list(squares))linedisplaces를 합니다.

요약:

  • 반복기를 다룰 때 반복기는 스테이트풀하며 반복기를 통과할 때 변이된다는 점을 기억해야 합니다.
  • 리스트는 명시적으로 변환했을 때만 변경되기 때문에 예측이 용이합니다.목록은 컨테이너입니다.
  • 그리고 보너스: 숫자, 문자열, 튜플은 전혀 변하지 않기 때문에 더 예측이 가능합니다. 그것들은 이기 때문입니다.

다음으로 생각할 수 있는 예를 제시하겠습니다.

map(lambda op1,op2: op1*op2, list1, list2)

비교:

[op1*op2 for op1,op2 in zip(list1,list2)]

zip()은 맵이 아닌 리스트 컴파션을 고집하는 경우 고려해야 하는 유감스럽고 불필요한 오버헤드라고 생각합니다.누군가 이것을 긍정적이든 부정적이든 명확히 해 준다면 좋을 것이다.

코드를 이라면, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」,map - 비동기, 병렬가 "-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-""-""-""-"""-"""""-"""""-"""""""-""""""""""""""""""""""""""""""mapPython을 map 후, 「이행」을 해 주세요map코드의 나머지 부분에서는, 병행(등)을 실행하기 위해서 원래의 시리얼 코드를 변경할 필요가 없는 경우가 있습니다.

라는 것은 내가 일을 더 잘 을 알 수 있습니다.map- 둘, 될 수 를 덜어줍니다. - ㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴ)lambda★★★★★★ 。

귀도에게 귀도를 소개한 수 ).lambda그리고 그 기능은 그가 Python에 받아들인 것을 가장 후회하는 것으로 기능하기 때문에 당신은 그들이 Python적이지 않다고 주장할 수 있다.

따라서 Python 3는 반복기이므로 무엇이 필요한지 기억해야 합니다: 반복기 또는list★★★★★★ 。

@AlexMartelli가 이미 언급했듯이,map() 수 있는 것은 목록 이해보다 빠를 수 있습니다.lambda★★★★★★ 。

몇 가지 시간 비교를 보여 드리겠습니다.

.5 및 Python 3.5.2 † CPython
는 주피터 노트북과 특히 내장된 마법 명령어를 사용해 보았다.
측정값: s == 1000 ms == 1000 * 1000 µs = 1000 * 1000 ns

셋업:

x_list = [(i, i+1, i+2, i*2, i-9) for i in range(1000)]
i_list = list(range(1000))

내장 기능:

%timeit map(sum, x_list)  # creating iterator object
# Output: The slowest run took 9.91 times longer than the fastest. 
# This could mean that an intermediate result is being cached.
# 1000000 loops, best of 3: 277 ns per loop

%timeit list(map(sum, x_list))  # creating list with map
# Output: 1000 loops, best of 3: 214 µs per loop

%timeit [sum(x) for x in x_list]  # creating list with list comprehension
# Output: 1000 loops, best of 3: 290 µs per loop

lambda★★★★

%timeit map(lambda i: i+1, i_list)
# Output: The slowest run took 8.64 times longer than the fastest. 
# This could mean that an intermediate result is being cached.
# 1000000 loops, best of 3: 325 ns per loop

%timeit list(map(lambda i: i+1, i_list))
# Output: 1000 loops, best of 3: 183 µs per loop

%timeit [i+1 for i in i_list]
# Output: 10000 loops, best of 3: 84.2 µs per loop

제너레이터 표현과 같은 것도 있습니다. PEP-0289를 참조하십시오.그래서 나는 그것을 비교에 추가하는 것이 유용할 것이라고 생각했다.

%timeit (sum(i) for i in x_list)
# Output: The slowest run took 6.66 times longer than the fastest. 
# This could mean that an intermediate result is being cached.
# 1000000 loops, best of 3: 495 ns per loop

%timeit list((sum(x) for x in x_list))
# Output: 1000 loops, best of 3: 319 µs per loop

%timeit (i+1 for i in i_list)
# Output: The slowest run took 6.83 times longer than the fastest. 
# This could mean that an intermediate result is being cached.
# 1000000 loops, best of 3: 506 ns per loop

%timeit list((i+1 for i in i_list))
# Output: 10000 loops, best of 3: 125 µs per loop

필요하다list★★★★★★★★★★★★★★★★★★:

목록 하고, 커스텀 함수인 경우 목록 이해를 사용합니다.list(map())

없다list오브젝트, 당신은 단지 반복할 수 있는 것이 필요합니다.

「」를 사용합니다.map()!

오브젝트의 메서드를 호출하는 세 가지 메서드를 비교한 간단한 테스트를 실행했습니다.이 경우 시간 차이는 무시할 수 있으며 해당 함수의 문제입니다(@Alex Martelli의 응답 참조).여기서는 다음 방법을 살펴봤습니다.

# map_lambda
list(map(lambda x: x.add(), vals))

# map_operator
from operator import methodcaller
list(map(methodcaller("add"), vals))

# map_comprehension
[x.add() for x in vals]

된) 목록을 .vals 정수 두 두 、 Python 두 ( Python ) ) int와 부동소수점수(Python)float목록 크기를 늘립니다. 클래스DummyNum고려되는 것은 다음과 같습니다.

class DummyNum(object):
    """Dummy class"""
    __slots__ = 'n',

    def __init__(self, n):
        self.n = n

    def add(self):
        self.n += 5

「」입니다.add★★★★★★__slots__에 하기 위한 한 최적화입니다., memorysize.attribute는, Python 의 사이즈를 합니다.뭇매를 맞다

Python 객체 메서드의 매핑 성능

앞에서 설명한 바와 같이 사용되는 기술은 최소한의 차이가 있으므로 사용자가 가장 쉽게 읽을 수 있는 방식으로 또는 특정 상황에서 코드를 작성해야 합니다. 「」 「」 「 」map_comprehension기술)은 객체에서 두 가지 유형의 추가 모두에 대해 가장 빠릅니다. 특히 목록이 짧은 경우에는 더 빠릅니다.

플롯과 데이터를 생성하는 데 사용되는 소스를 보려면 이 페이스트빈을 방문하십시오.

나는 성능표( 프로젝트)로 몇 가지 결과를 측정했다.

다른 사람들이 지적했듯이map실제로는 반복기만 반환하기 때문에 고정시간 작업입니다.에 의해 list()이치노표현에 따라서는 어느 한쪽이 약간 엣지가 있을 수 있지만, 거의 의미가 없습니다.

은 꼭 주의해 주세요.x ** 2특히 입력 데이터가 이미 NumPy 배열인 경우에는 NumPy가 훨씬 빠릅니다.

hex:

여기에 이미지 설명 입력

x ** 2:

여기에 이미지 설명 입력


그림을 재현하는 코드:

import perfplot


def standalone_map(data):
    return map(hex, data)


def list_map(data):
    return list(map(hex, data))


def comprehension(data):
    return [hex(x) for x in data]


b = perfplot.bench(
    setup=lambda n: list(range(n)),
    kernels=[standalone_map, list_map, comprehension],
    n_range=[2 ** k for k in range(20)],
    equality_check=None,
)
b.save("out.png")
b.show()
import perfplot
import numpy as np


def standalone_map(data):
    return map(lambda x: x ** 2, data[0])


def list_map(data):
    return list(map(lambda x: x ** 2, data[0]))


def comprehension(data):
    return [x ** 2 for x in data[0]]


def numpy_asarray(data):
    return np.asarray(data[0]) ** 2


def numpy_direct(data):
    return data[1] ** 2


b = perfplot.bench(
    setup=lambda n: (list(range(n)), np.arange(n)),
    kernels=[standalone_map, list_map, comprehension, numpy_direct, numpy_asarray],
    n_range=[2 ** k for k in range(20)],
    equality_check=None,
)
b.save("out2.png")
b.show()

@alex-martelli로 코드를 시도했지만 몇 가지 불일치를 발견했습니다.

python -mtimeit -s "xs=range(123456)" "map(hex, xs)"
1000000 loops, best of 5: 218 nsec per loop
python -mtimeit -s "xs=range(123456)" "[hex(x) for x in xs]"
10 loops, best of 5: 19.4 msec per loop

지도는 매우 넓은 범위에서도 같은 시간이 걸리고 목록 이해는 내 코드에서 알 수 있듯이 많은 시간이 걸린다.그래서 "비언어적"이라고 생각되는 것 외에는 지도 사용에 관한 성능 문제에 직면한 적이 없습니다.

여기에 이미지 설명 입력

이미지 소스:익스피리언스

목록 이해와 지도 기능 중 어느 것이 더 나은지 직접 확인할 수 있습니다.

(목록 이해는 지도 함수에 비해 100만 개의 레코드를 처리하는 데 걸리는 시간이 짧습니다.)

도움이 됐으면 좋겠다!행운을 빈다 :)

은 목록 이해를 하는 것이 목록 합니다.map ★★★★★★★★★★★★★★★★★」filter는 목록 가 목록보다 map ★★★★★★★★★★★★★★★★★」filter.

In [1]: odd_cubes = [x ** 3 for x in range(10) if x % 2 == 1] # using a list comprehension

In [2]: odd_cubes_alt = list(map(lambda x: x ** 3, filter(lambda x: x % 2 == 1, range(10)))) # using map and filter

In [3]: odd_cubes == odd_cubes_alt
Out[3]: True

는 따로 .lambda은 「 」라고 하는 표현.map쉽게 할 수 반면, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ다.map에는 「」가 필요합니다.filter필터링을 가능하게 합니다.

사용 예:

def sum_items(*args):
    return sum(args)


list_a = [1, 2, 3]
list_b = [1, 2, 3]

list_of_sums = list(map(sum_items,
                        list_a, list_b))
>>> [3, 6, 9]

comprehension = [sum(items) for items in iter(zip(list_a, list_b))]

저는 맵을 더 많이 사용하기 시작했고, pass 인수와 return 인수 때문에 맵이 comp보다 느릴 수 있다고 생각했기 때문에 이 글을 찾았습니다.

특히 목록의 값을 구성해야 할 때 지도를 사용하는 것이 훨씬 읽기 쉽고 유연하다고 생각합니다.

지도를 보면 실제로 알 수 있어요.

def pair_list_items(*args):
    return args

packed_list = list(map(pair_list_items,
                       lista, *listb, listc.....listn))

유연성 보너스도 있습니다.그리고 다른 모든 답변과 성과급에 대해 감사드립니다.

언급URL : https://stackoverflow.com/questions/1247486/list-comprehension-vs-map

반응형