Однако в Python 3.1 приведенное выше возвращает объект map .
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94]) <mapobject at 0x00AF5570>
Как мне получить сопоставленный список (как в A выше) на Python 3.x?
В качестве альтернативы, есть ли лучший способ сделать это? Мой исходный объект list содержит около 45 элементов, и я хотел бы преобразовать их в шестнадцатеричный формат.
Переведено автоматически
Ответ 1
Сделайте это:
list(map(chr,[66,53,0,94]))
В Python 3+ многие процессы, которые перебирают повторяющиеся объекты, сами возвращают итераторы. В большинстве случаев это приводит к экономии памяти и должно ускорить работу.
Если все, что вы собираетесь делать, это в конечном итоге выполнять итерацию по этому списку, нет необходимости даже преобразовывать его в список, потому что вы все равно можете выполнять итерацию по map объекту следующим образом:
# Prints "ABCD" for ch inmap(chr,[65,66,67,68]): print(ch)
Всегда ища более короткие способы, я обнаружил, что этот тоже работает:
*map(chr, [66, 53, 0, 94]),
Распаковка работает и с кортежами. Обратите внимание на запятую в конце. Это делает его кортежем из 1 элемента. То есть это эквивалентно (*map(chr, [66, 53, 0, 94]),)
Это короче всего на один символ по сравнению с версией со списком-скобками, но, на мой взгляд, лучше писать, потому что вы начинаете прямо с синтаксиса расширения asterisk , поэтому я чувствую, что это мягче на уме. :)
Преимущество функции map, возвращающей список, заключается в экономии ввода, особенно во время интерактивных сеансов. Вы можете определить lmap функцию (по аналогии с python2 imap), которая возвращает список:
Тогда вызов 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