Вопрос-Ответ

Getting a map() to return a list in Python 3.x [duplicate]

Получение map() для возврата списка в Python 3.x

Я пытаюсь преобразовать список в шестнадцатеричный формат, а затем использовать список в другом месте. В python 2.6 это было легко:

Ответ: Python 2.6:

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

Однако в Python 3.1 приведенное выше возвращает объект map .

B: Python 3.1:

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

Как мне получить сопоставленный список (как в A выше) на Python 3.x?

В качестве альтернативы, есть ли лучший способ сделать это? Мой исходный объект list содержит около 45 элементов, и я хотел бы преобразовать их в шестнадцатеричный формат.

Переведено автоматически
Ответ 1

Сделайте это:

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

В Python 3+ многие процессы, которые перебирают повторяющиеся объекты, сами возвращают итераторы. В большинстве случаев это приводит к экономии памяти и должно ускорить работу.

Если все, что вы собираетесь делать, это в конечном итоге выполнять итерацию по этому списку, нет необходимости даже преобразовывать его в список, потому что вы все равно можете выполнять итерацию по map объекту следующим образом:

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

Новое и аккуратное в Python 3.5:

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

Благодаря дополнительным обобщениям распаковки

Обновить

Всегда ища более короткие способы, я обнаружил, что этот тоже работает:

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

Распаковка работает и с кортежами. Обратите внимание на запятую в конце. Это делает его кортежем из 1 элемента. То есть это эквивалентно (*map(chr, [66, 53, 0, 94]),)

Это короче всего на один символ по сравнению с версией со списком-скобками, но, на мой взгляд, лучше писать, потому что вы начинаете прямо с синтаксиса расширения asterisk , поэтому я чувствую, что это мягче на уме. :)

Ответ 3

Почему вы этого не делаете:

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

Это называется пониманием списка. Вы можете найти много информации в Google, но вот ссылка на документацию Python (2.6) по пониманию списков. Однако вас может больше заинтересовать документация Python 3.

Ответ 4

Преимущество функции 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.

К исходному вопросу был комментарий:


Я бы предложил переименовать в Получение map() для возврата списка в Python 3. * поскольку это применимо ко всем версиям Python3. Есть ли способ сделать это? – meawoppl 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
2023-10-22 17:42 python list python-3.x