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

python list python-3.x map-function

264850 просмотра

9 ответа

Я пытаюсь отобразить список в шестнадцатеричный, а затем использовать список в другом месте. В 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 элементов, а id - для преобразования их в шестнадцатеричный.

Автор: mozami Источник Размещён: 17.05.2019 03:47

Ответы (9)


580 плюса

Решение

Сделай это:

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

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

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

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)
Автор: Triptych Размещён: 20.08.2009 12:28

81 плюса

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

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

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

Автор: Mark Rushakoff Размещён: 20.08.2009 12:28

61 плюса

Новый и опрятный в Python 3.5:

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

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

ОБНОВИТЬ

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

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

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

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

Автор: Israel Unterman Размещён: 01.08.2016 03:18

20 плюса

Функция отображения списков, возвращающая карту, имеет преимущество сохранения набора текста, особенно во время интерактивных сеансов. Вы можете определить 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.

Был комментарий к первому вопросу:

Я бы предложил переименовать Get 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
Автор: Boris Gorelik Размещён: 01.07.2014 09:41

11 плюса

Я не знаком с Python 3.1, но будет ли это работать?

[chr(x) for x in [66, 53, 0, 94]]
Автор: Andrew Keeton Размещён: 20.08.2009 12:28

3 плюса

Преобразование моего старого комментария для лучшей видимости: для «лучшего способа сделать это» без mapцели, если ваши входы, как известно, являются ординалами ASCII, обычно гораздо быстрее конвертировать bytesи декодировать a 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)

Если вы оставите его как a str, потребуется ~ 20% времени самых быстрых mapрешений; даже конвертируя обратно в список, он по-прежнему составляет менее 40% от самого быстрого mapрешения. Массовое преобразование через, bytesа bytes.decodeзатем преобразование объема обратно в listэкономит много работы, но, как отмечено, работает только в том случае, если все ваши входы являются ординалами ASCII (или ординалы в некотором байте на конкретную кодировку для конкретного языка, например latin-1).

Автор: ShadowRanger Размещён: 08.11.2017 04:52

0 плюса

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

map (func, * iterables) -> map object Сделать итератор, который вычисляет функцию, используя аргументы из каждого из iterables. Остановка, когда исчерпана самая короткая итерация.

«Сделать итератор»

означает, что он вернет итератор.

", который вычисляет функцию, используя аргументы из каждого из повторяющихся"

означает, что функция next () итератора будет принимать одно значение каждого итератора и передавать каждый из них одному позиционному параметру функции.

Таким образом, вы получаете итератор из функции map () funtion и jsut передаете его в функцию встроенного списка () или используете списки.

Автор: Ini Размещён: 07.11.2017 09:04

0 плюса

В дополнение к приведенным выше ответам Python 3, мы можем просто создать значение listрезультата из a mapas

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]
Автор: Harry_pb Размещён: 15.06.2018 04:35

0 плюса

Используя понимание списка в утилите python и базовой функции карты, можно так же сделать.

chi = [x для x на карте (chr, [66,53,0,94])]

Автор: darshan k s Размещён: 11.11.2018 04:57
Вопросы из категории :
32x32