복붙노트

[PYTHON] 파이썬 3 대 파이썬 2 맵 비헤이비어

PYTHON

파이썬 3 대 파이썬 2 맵 비헤이비어

파이썬 2에서 공통적으로 사용되는 관용구 (old, legacy)는 맵을 사용하여 형태 맵 (None, iter, iter, ...)을 사용하여 불균등 한 길이의 반복자를 조인하는 것이다.

>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]

Python 2에서는 가장 긴 iterator가 반환 된리스트의 길이가되도록하고 다른 하나보다 짧으면 None으로 채워진다.

파이썬 3에서는이 점이 다릅니다. 첫째, 위치 1에서 호출 가능 호출에 대한 인수로 없음을 사용할 수 없습니다.

>>> list(map(None, range(5),range(10,12)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

확인 - 그렇게 수정할 수 있습니다.

>>> def f(*x): return x    
... 
>>> list(map(f, *(range(5),range(10,12))))
[(0, 10), (1, 11)]

하지만 이제는 다른 문제가 있습니다. map은 가장 짧은 반복자 길이를 반환합니다. 더 이상 None으로 채워지지 않습니다.

파이썬 2 코드를 파이썬 3에 포팅 할 때 이것은 끔찍한 드문 관용구가 아니며 쉬운 해결책을 찾지 못했습니다.

안타깝게도 2to3 도구는이 문제를 해결하지 않습니다.

-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18)))) 

제안?

편집하다

이 관용구가 얼마나 일반적인 지에 대한 논의가 있습니다. 이 게시물을 참조하십시오.

나는 고등학교에있을 때 작성된 레거시 코드를 업데이트하고 있습니다. Raymond Hettinger가 2003 년 파이썬 자습서를 작성하여 토론하고지도의 특정 동작을 지적했습니다.

해결법

  1. ==============================

    1.itertools.zip_longest는보다 이해하기 쉬운 이름으로 원하는 것을 수행합니다. :)

    itertools.zip_longest는보다 이해하기 쉬운 이름으로 원하는 것을 수행합니다. :)

  2. ==============================

    2.나는 이번에 내 자신의 질문에 대답 할 것이다.

    나는 이번에 내 자신의 질문에 대답 할 것이다.

    Python 3x에서는 itertools.zip_longest를 다음과 같이 사용할 수 있습니다.

    >>> list(map(lambda *a: a,*zip(*itertools.zip_longest(range(5),range(10,17)))))
    [(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (None, 15), (None, 16)]
    

    너는 내가 생각하기에 너 자신을 굴릴 수도있다.

    >>> def oldMapNone(*ells):
    ...     '''replace for map(None, ....), invalid in 3.0 :-( '''
    ...     lgst = max([len(e) for e in ells])
    ...     return list(zip(* [list(e) + [None] * (lgst - len(e)) for e in ells]))
    ... 
    >>> oldMapNone(range(5),range(10,12),range(30,38))
    [(0, 10, 30), (1, 11, 31), (2, None, 32), (3, None, 33), (4, None, 34), (None, None, 35), (None, None, 36), (None, None, 37)]
    
  3. ==============================

    3.당신은 다음과 같은 문제를 해결할 수 있습니다 : 리스트 (map (λ x, y : (x, y), [1, 2, 3, 4, 5], [6, 7, 8, 9, 10]))

    당신은 다음과 같은 문제를 해결할 수 있습니다 : 리스트 (map (λ x, y : (x, y), [1, 2, 3, 4, 5], [6, 7, 8, 9, 10]))

  4. from https://stackoverflow.com/questions/12015521/python-3-vs-python-2-map-behavior by cc-by-sa and MIT license