Я пытаюсь отобразить список в гекс, а затем использовать список в другом месте. В 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>
Как мне получить сопоставленный список (как в A выше) на Python 3.x?
В качестве альтернативы, есть ли лучший способ сделать это? Мой начальный объект списка содержит около 45 элементов, и я хотел бы преобразовать их в шестнадцатеричные.
python
list
python-3.x
map-function
mozami
источник
источник
map()
был почти удален из языка, потому что нет причин использовать его для понимания списка илиfor
цикла.Ответы:
Сделай это:
В Python 3+ многие процессы, которые выполняют итерации, возвращают сами итераторы. В большинстве случаев это приводит к экономии памяти и должно ускорить процесс.
Если все, что вы собираетесь сделать, это в конечном итоге перебрать этот список, нет необходимости даже конвертировать его в список, потому что вы все еще можете перебирать
map
объект следующим образом:источник
map
будет ленивая оценка при итерации сложной функции, больших наборов данных или потоков.bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')
чтоstr
ускоряет процесс , избегая вызовов функций Python для каждого элемента в пользу массового преобразования все элементы, использующие только вызовы функций уровня C. Вы можете обернуть вышеупомянутое,list
если вам действительно нуженlist
отдельный символ, но такstr
как он уже итерируем из своих собственных символов, единственная причина, по которой вы это сделаете, это если вам нужна изменчивость.Новое и аккуратное в Python 3.5:
Благодаря дополнительным обобщениям распаковки
ОБНОВИТЬ
Всегда ища более короткие пути, я обнаружил, что этот тоже работает:
Распаковка тоже работает в кортежах. Обратите внимание на запятую в конце. Это делает его кортежем из 1 элемента. То есть это эквивалентно
(*map(chr, [66, 53, 0, 94]),)
Он короче всего на один символ из версии со списочными скобками, но, на мой взгляд, лучше написать, потому что вы начинаете прямо со звездочки - синтаксиса расширения, так что я чувствую, что это мягче на уме. :)
источник
list()
не выглядит опрятноlist
конструктор и вызывать механизм вызова общих функций. Для длинного ввода это не имеет значения; для короткого, это может иметь большое значение. Используя приведенный выше код с вводом в качестве такового,tuple
чтобы он не восстанавливался многократно,ipython
микробенчмарки показывают, чтоlist()
подход обертки занимает примерно на 20% больше времени, чем распаковка. Имейте в виду, в абсолютном выражении мы говорим о 150 нс, что тривиально, но вы поняли идею.map
? Может быть, с новым именем (lmap
?), Если по умолчанию будет возвращаться итератор?*map()
дает ошибку синтаксиса наPython 3.6
:can't use starred expression here
. Вы должны поместить это вlist
:[ *map() ]
Почему ты не делаешь это:
Это называется пониманием списка. Вы можете найти много информации в Google, но вот ссылка на документацию по Python (2.6) по спискам . Возможно, вас больше заинтересует документация по Python 3 .
источник
map(chr, [66,53,0,94])
определенно более кратким, чем[chr(x) for x in [66,53,0,94]]
.Функция карты, возвращающая список, имеет преимущество сохранения набора текста, особенно во время интерактивных сеансов. Вы можете определить
lmap
функцию (по аналогии с python2imap
), которая возвращает список:Тогда вызов
lmap
вместо того,map
чтобы сделать работу:lmap(str, x)
короче на 5 символов (30% в этом случае), чемlist(map(str, x))
и, безусловно, короче, чем[str(v) for v in x]
. Вы можете создать аналогичные функции дляfilter
тоже.Был комментарий к оригинальному вопросу:
Это есть возможность сделать это, но это очень плохая идея. Просто для забавы, вот как вы можете ( но не должны ) делать это:
источник
Преобразование моего старого комментария для лучшей наглядности: для «лучшего способа сделать это»
map
полностью, если известно, что ваши входные данные являются ординалами ASCII, обычно намного быстрее конвертироватьbytes
и декодировать, а-ляbytes(list_of_ordinals).decode('ascii')
. Это дает вам одноstr
из значений, но если вам нужнаlist
изменчивость или тому подобное, вы можете просто преобразовать ее (и она все еще быстрее). Например, вipython
микробенчмарках, конвертирующих 45 входов:Если вы оставите его как
str
, это займет ~ 20% времени самых быстрыхmap
решений; даже если вернуться к списку, это все равно менее 40% самого быстрогоmap
решения. Массовое преобразование с помощью массового преобразованияbytes
иbytes.decode
последующее массовое преобразование обратно вlist
экономит много работы, но, как уже было отмечено, работает, только если все ваши входные данные являются порядковыми числами ASCII (или порядковыми числами в несколько байтов на кодировку, специфичную для локали, напримерlatin-1
).источник
означает, что он вернет итератор.
означает, что функция next () итератора будет принимать одно значение каждого итерируемого элемента и передавать каждое из них одному позиционному параметру функции.
Таким образом, вы получаете итератор из функции map () и передаете его во встроенную функцию list () или используете списки.
источник
В дополнении к выше ответам в
Python 3
, мы можем просто создатьlist
значения результата из ,map
какМы можем обобщить на другом примере, где меня поразили, операции с картой также можно обрабатывать аналогично, как в
regex
задаче, мы можем написать функцию для полученияlist
элементов для отображения и получения набора результатов одновременно. Ex.источник
Вы можете попробовать получить список из объекта карты, просто перебирая каждый элемент в объекте и сохраняя его в другой переменной.
источник
Используя понимание списка в python и утилиту базовой функции map, можно также сделать это:
chi = [x for x in map(chr,[66,53,0,94])]
источник