Python 3.x에서 목록을 반환하는 맵() 가져오기
목록을 16진수로 매핑한 다음 다른 곳에서 사용하려고 해.python 2.6에서는 이것이 쉬웠다.
A: Python 2.6:
>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
그러나 Python 3.1에서는 위의 내용이 지도 객체를 반환한다.
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>
Python 3.x에서 매핑된 목록(위의 A와 동일)을 검색하려면 어떻게 해야 하는가?
아니면, 더 좋은 방법이 있을까?나의 초기 리스트 오브젝트는 약 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]]
그걸 목록 이해라고 해.구글에서 많은 정보를 찾을 수 있지만, 여기 목록 포괄성에 대한 파이썬(2.6) 문서 링크 입니다.하지만 파이톤 3 문서에 더 관심이 있을 겁니다.
목록 되돌리기 맵 기능은 특히 대화형 세션에서 타이핑을 저장할 수 있는 장점이 있다.정의할 수 있다.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
나도 마찬가지야.
원문에는 다음과 같은 코멘트가 있었다.
Python 3.*의 목록을 모든 Python3 버전에 적용할 수 있도록 Geting map()으로 이름을 바꾸도록 제안한다.이렇게 할 방법이 있을까?- 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
, 가장 빠른 시간의 20%가 걸린다.map
솔루션; 목록으로 다시 변환하더라도 여전히 가장 빠른 40% 미만임map
해결책다음을 통해 대량 변환bytes
그리고bytes.decode
대량으로 변환으로 list
많은 작업을 저장하지만, 이미 언급한 바와 같이, 모든 입력이 ASCII 서수(또는 문자 로케일별 인코딩(예: 문자당 1바이트)인 경우에만 작동한다.latin-1
).
list(map(chr, [66, 53, 0, 94]))
map(func, *iterables) --> map object 각 반복 파일의 인수를 사용하여 함수를 계산하는 반복기를 만든다.가장 짧은 반복이 소진되면 중지한다.
"반복자를 만드세요"
반복기를 돌려준다는 뜻이야
"각 반복가능성의 인수를 사용하여 함수를 계산하는"
즉, 다음 반복기 함수는 각 반복기들의 값을 한 개씩 취하여 각 반복기들을 함수의 하나의 위치 매개변수로 전달한다.
그래서 지도()에서 반복기를 구하면 jsut이 그것을 내장된 함수()로 전달하거나 목록 포괄성을 사용한다.
에 『의도』에 수록되어 있다.Python 3
, 우리는 단순히 a를 창조할 수 있다.list
에서 가치의.map
로서
li = []
for x in map(chr,[66,53,0,94]):
li.append(x)
print (li)
>>>['B', '5', '\x00', '^']
내가 당한 또 다른 예에 의해 일반화 될 수도 있다. 지도상의 작전도 비슷한 방식으로 처리될 수 있다.regex
문제, 우리는 얻을 수 있는 기능을 쓸 수 있다.list
맵핑할 항목과 결과 집합을 동시에 가져오는 항목. ex.
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]
개체 내의 각 항목을 반복하기만 하면 맵 개체에서 목록을 가져와 다른 변수에 저장할 수 있다.
a = map(chr, [66, 53, 0, 94])
b = [item for item in a]
print(b)
>>>['B', '5', '\x00', '^']
다른 옵션은 바로 가기를 만들고 목록을 반환하는 것이다.
from functools import reduce
_compose = lambda f, g: lambda *args: f(g(*args))
lmap = reduce(_compose, (list, map))
>>> lmap(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
파이톤3에서 이것을 하는 가장 좋은 방법.x
간단히 말해서 당신은 이것을 한 줄로 할 수 있다.
#Devil
input_list = [66, 53, 0, 94]
out = [chr(x) for x in input_list]
print(out)
# you will get the desire output in out list
# ['B', '5', '\x00', '^']
#------------------------------
#To retrieve your list use 'ord'
original_list = [ord(x) for x in out]
print(original_list )
#[66, 53, 0, 94]
파이톤과 기본 지도 기능 유틸리티에서 목록 이해를 사용하여 다음과 같은 작업도 할 수 있다.
chi = [x for x in map(chr,[66,53,0,94])]
참조URL: https://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
'IT이야기' 카테고리의 다른 글
Vue 웹 팩이 모든 URL에 #/를 추가하는 중 (0) | 2022.03.21 |
---|---|
Rxjs 필터 연산자가 각도2 관찰 가능으로 작업하지 않음 (0) | 2022.03.21 |
구성 reactive-native-maps에서 "supportLibVersion", "playServicesVersion" 및 "androidMapsUtilsVersion" 값을 확인하십시오. (0) | 2022.03.21 |
뉴라인 없이 인쇄(인쇄 'a'), 인쇄 공간, 제거 방법? (0) | 2022.03.21 |
TS2339: 속성 'tsReducer'가 'DefaultRootState' 유형에 없음 (0) | 2022.03.21 |