[python] Python 3.x에서 목록을 반환하기 위해 map () 가져 오기

목록을 16 진수로 매핑 한 다음 다른 곳에서 목록을 사용하려고합니다. 파이썬 2.6에서는 이것이 쉬웠다.

A : 파이썬 2.6 :

>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']

그러나 Python 3.1에서는 위의 맵 객체가 반환됩니다.

B : 파이썬 3.1 :

>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>

A 에서와 같이 매핑 된 목록을 검색하는 방법 파이썬 3.x의에서 이상)?

또는이 작업을 수행하는 더 좋은 방법이 있습니까? 내 초기 목록 객체에는 약 45 개의 항목이 있으며 ID는 16 진수로 변환하고 싶습니다.



답변

이 작업을 수행:

list(map(chr,[66,53,0,94]))

Python 3 이상에서는 반복 가능 항목을 반복하는 많은 프로세스가 반복자 자체를 반환합니다. 대부분의 경우 메모리가 절약되어 작업 속도가 빨라집니다.

이 목록을 결국 반복하는 것만으로도 목록을 변환 할 필요가 없습니다. map객체를 다음과 같이 반복 할 수 있기 때문입니다 .

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)


답변

Python 3.5의 새롭고 깔끔한 기능 :

[*map(chr, [66, 53, 0, 94])]

추가적인 포장 풀기 일반화 덕분에

최신 정보

항상 더 짧은 길을 찾고 있는데, 이것도 효과가 있습니다.

*map(chr, [66, 53, 0, 94]),

포장 풀기는 튜플에서도 작동합니다. 끝에 쉼표를 적어 둡니다. 이것은 1 요소의 튜플을 만듭니다. 즉,(*map(chr, [66, 53, 0, 94]),)

목록 대괄호가있는 버전의 문자 하나만 짧아 지지만 내 의견으로는 별표 (확장 구문)로 시작하기 때문에 작성하는 것이 좋습니다. 그래서 마음이 부드럽습니다. 🙂


답변

왜 이러지 않습니까?

[chr(x) for x in [66,53,0,94]]

이것을 목록 이해력이라고합니다. Google에서 많은 정보를 찾을 수 있지만 다음은 목록 이해에 대한 Python (2.6) 문서에 대한 링크 입니다. 그러나 Python 3 문서 에 더 관심이있을 수 있습니다 .


답변

목록 리턴 맵 기능은 특히 대화식 세션에서 타이핑을 저장하는 이점이 있습니다. list를 반환 하는 lmap함수 (python2와 유사)를 정의 할 수 있습니다 imap.

lmap = lambda func, *iterable: list(map(func, *iterable))

그런 다음 lmap대신 호출 map하면 작업이 수행
lmap(str, x)됩니다. 5 자 (이 경우 30 %)보다 list(map(str, x))짧고 확실히 짧습니다 [str(v) for v in x]. 비슷한 기능을 만들 수도 있습니다 filter.

원래 질문에 대한 의견이있었습니다.

모든 Python3 버전에 적용되므로 Python 3. *에서 목록을 반환하도록 Getting map ()으로 이름을 바꾸는 것이 좋습니다. 이 방법이 있습니까? – meawoppl 1 월 24 일 17:58

이다 그렇게 할 수 있지만, 아주 나쁜 생각이다. 재미를 위해 여기에 어떻게 할 수 있는지 ( 그러나해서는 안되는 ) 방법이 있습니다.

__global_map = map #keep reference to the original map
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion
map = lmap
x = [1, 2, 3]
map(str, x) #test
map = __global_map #restore the original map and don't do that again
map(str, x) #iterator


답변

가시성을 높이기 위해 이전 주석 을 변환 : map입력이 ASCII 서수라고 알려진 경우 전체적으로 “이를 수행하는 더 좋은 방법”을 얻으 려면 일반적으로 bytesla 로 변환 하고 디코딩하는 것이 훨씬 빠릅니다 bytes(list_of_ordinals).decode('ascii'). 그것은 당신에게 str값을 가져다 주지만, 변경 list가능성 등 이 필요하다면, 그것을 변환 할 수 있습니다 (그리고 여전히 더 빠릅니다). 예를 들어 ipython45 개의 입력을 변환 하는 마이크로 벤치 마크 에서 :

>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

로 남겨두면 str가장 빠른 map솔루션 시간의 ~ 20 %가 소요됩니다 . 다시 목록으로 변환해도 여전히 가장 빠른 map솔루션 의 40 % 미만 입니다. 대량 변환을 통한 대량 변환 bytesbytes.decode다시 대량 변환 list은 많은 작업 을 절약 하지만 , 언급 한 바와 같이 모든 입력이 ASCII 서수 (또는 문자 로케일 별 인코딩 (예 🙂 당 1 바이트의 서수) 인 경우에만 작동합니다 latin-1.


답변

list(map(chr, [66, 53, 0, 94]))

map (func, * iterables)-> map 객체 각 iterables의 인수를 사용하여 함수를 계산하는 반복자를 만듭니다. 가장 짧은 iterable이 소진되면 중지합니다.

“반복자 만들기”

반복자를 반환한다는 의미입니다.

“각 iterables의 인수를 사용하여 함수를 계산합니다.”

iterator의 next () 함수는 각 iterables의 값 하나를 가져 와서 함수의 위치 매개 변수 하나에 전달합니다.

따라서 map () 함수에서 반복자를 가져오고 jsut은 list () 내장 함수에 전달하거나 목록 이해를 사용합니다.


답변

의 위의 답변 외에도 as 에서 결과 값을 Python 3만들 수 있습니다.listmap

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

우리는 내가 맞은 또 다른 예를 통해 일반화 할 수 있습니다.지도상의 작업도 regex문제 와 비슷한 방식으로 처리 할 수 ​​있으며 매핑 할 list항목을 가져오고 동시에 결과 세트 를 얻는 기능을 작성할 수 있습니다. 전의.

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]