문제

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

ㅏ: 파이썬 2.6:

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

그러나 Python 3.1에서는 위의 내용이 지도 객체를 반환합니다.

비: 파이썬 3.1:

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

매핑된 목록을 검색하려면 어떻게 해야 합니까(예: 위) Python 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)

다른 팁

왜 이것을하지 않는다 :

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

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

파이썬에서 새롭고 깔끔한 3.5 :

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

감사합니다 추가 포장 풀기 일반화

업데이트

항상 짧은 방법을 찾고 있는데, 나는 이것도 효과가 있다는 것을 발견했습니다.

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

포장 풀기는 튜플에서도 작동합니다. 끝에 쉼표를 기록하십시오. 이것은 1 요소의 튜플입니다. 즉, 그것은 동일합니다 (*map(chr, [66, 53, 0, 94]),)

List -Brackets가있는 버전에서 단 하나의 숯으로 만 짧지 만 내 의견으로는 별표로 바로 시작하기 때문에 글을 쓰는 것이 좋습니다. :)

List Returning MAP 기능은 특히 대화식 세션 동안 타이핑을 저장하는 이점이 있습니다. 당신은 정의 할 수 있습니다 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에서 목록을 반환하려면 Map ()를 얻는 이름을 바꾸는 것이 좋습니다.* 모든 Python3 버전에 적용됩니다. 이것을 할 방법이 있습니까? - 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

나는 Python 3.1에 익숙하지 않지만 이것이 효과가 있습니까?

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

변환 내 오래된 의견 더 나은 가시성을 위해 : "이것을하는 더 나은 방법"없이 map 전적으로 입력이 ASCII 조례로 알려져 있다면 일반적으로 변환하는 것이 훨씬 빠릅니다. bytes 그리고 Decode, la bytes(list_of_ordinals).decode('ascii'). 그것은 당신을 얻습니다 str 값이지만 필요한 경우 a list 돌연변이 등의 경우 변환 할 수 있습니다 (그리고 여전히 더 빠릅니다). 예를 들어, ipython 45 개의 입력을 변환하는 MicroBenchmark :

>>> %%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)

당신이 그것을 a로 남겨두면 str, 가장 빠른 시간의 ~ 20%가 소요됩니다. map 솔루션; 목록으로 되돌아 가도 여전히 가장 빠른 것의 40% 미만입니다. map 해결책. 벌크 변환을 통해 bytes 그리고 bytes.decode 그런 다음 벌크가 다시 변환됩니다 list 많은 작업을 저장하고 하지만 언급 한 바와 같이, 모든 입력이 ASCII 조례 인 경우에만 작동합니다 (또는 문자 로케일 별 인코딩 당 1 바이트의 조례, 예 : latin-1).

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

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

"반복자 만들기"

반복기를 반환한다는 것을 의미합니다.

"이것은 각 반복의 인수를 사용하여 기능을 계산합니다."

반복자의 다음 () 함수는 각 반복의 하나의 값을 취하고 각각의 함수의 하나의 위치 매개 변수로 전달한다는 것을 의미합니다.

따라서 Map () Function에서 반복자를 얻고 JSUT는 List () 내장 기능 또는 사용 목록 이해력으로 전달합니다.

위의 답변 외에도 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]

Python 및 Basic Map 함수 유틸리티에서 목록 이해력을 사용하면 다음을 수행 할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top