목록을 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 서수라고 알려진 경우 전체적으로 “이를 수행하는 더 좋은 방법”을 얻으 려면 일반적으로 bytes
la 로 변환 하고 디코딩하는 것이 훨씬 빠릅니다 bytes(list_of_ordinals).decode('ascii')
. 그것은 당신에게 str
값을 가져다 주지만, 변경 list
가능성 등 이 필요하다면, 그것을 변환 할 수 있습니다 (그리고 여전히 더 빠릅니다). 예를 들어 ipython
45 개의 입력을 변환 하는 마이크로 벤치 마크 에서 :
>>> %%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 % 미만 입니다. 대량 변환을 통한 대량 변환 bytes
및 bytes.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
만들 수 있습니다.list
map
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]