Получить значения Map (), используя Python 3.6.0 [duplicate]

Как говорит Лукас, то, что вы описываете, является предполагаемым поведением для свойства float. То, что сбивает с толку многих людей, заключается в том, что float был сильно вытеснен из-за своего первоначального предполагаемого использования, чтобы восполнить недостатки в модели макета CSS.

Посмотрите на Floatutorial , если вы Мне хотелось бы лучше понять, как это свойство работает.

375
задан vaultah 28 April 2016 в 15:03
поделиться

8 ответов

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

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

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

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

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)
537
ответ дан Triptych 18 August 2018 в 12:07
поделиться
  • 1
    Спасибо за отличное объяснение !! – mozami 20 August 2009 в 01:35
  • 2
    Конечно, вы также можете перебирать это: (chr (x) для x в [65,66,67,68]). Ему даже не нужна карта. – hughdbrown 20 August 2009 в 01:40
  • 3
    @hughdbrown Аргумент для использования 3.1 map был бы ленивой оценкой при итерации на сложной функции, больших наборах данных или потоках. – Andrew Keeton 20 August 2009 в 01:45
  • 4
    @ Андрей действительно Хью использует понимание генератора, которое будет делать то же самое. Обратите внимание на скобки, а не на квадратные скобки. – Triptych 20 August 2009 в 01:49
  • 5
    Альтернативное решение (быстрее для больших входов), когда значения, как известно, являются ASCII / latin-1, - это делать массовые конверсии на уровне C: bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1'), что делает str быстрее, избегая вызовов функций Python для каждого элемента в предпочтение массового преобразования всех элементов, используя только вызовы функций уровня C. Вы можете обернуть это в list, если вам действительно нужен list отдельных символов, но поскольку str уже является итерируемым для собственных символов, единственная причина, по которой вы это сделаете, - это если вам нужна изменчивость. – ShadowRanger 1 July 2016 в 01:52

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

[chr(x) for x in [66, 53, 0, 94]]
11
ответ дан Andrew Keeton 18 August 2018 в 12:07
поделиться

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

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]
0
ответ дан Harry_pb 18 August 2018 в 12:07
поделиться
  • 1
    @miradulo Я предположил в Python 2, список был возвращен, но в Python 3 возвращается только тип, и я просто попытался дать в том же формате. Если вы считаете его ненужным, возможно, такие люди, как я, которые могут найти это полезным, и поэтому я добавил. – Harry_pb 15 June 2018 в 17:32
  • 2
    Когда уже есть понимание списка, функция списка и ответ на распаковку, явный цикл цикла не добавляет много ИМХО. – miradulo 15 June 2018 в 20:04
list(map(chr, [66, 53, 0, 94]))

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

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

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

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

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

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

0
ответ дан Invader 18 August 2018 в 12:07
поделиться

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

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

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

56
ответ дан Israel Unterman 18 August 2018 в 12:07
поделиться
  • 1
    Что случилось с list()? – Quelklef 12 August 2017 в 12:56
  • 2
    @Quelklef list() не выглядит таким аккуратным – Arijoon 28 September 2017 в 13:15
  • 3
    @Quelklef: Кроме того, процесс распаковки выполняется тривиально быстрее, не требуя поиска конструктора list и вызова общих функций вызова. Для длительного ввода это не имеет значения; для короткого, это может иметь большое значение. Используя приведенный выше код с вводом как tuple, чтобы он не был повторно реконструирован, ipython показывает, что метод list() обертывания занимает около 20% дольше, чем распаковка. Имейте в виду, что в абсолютном выражении мы говорим о 150 нс, что тривиально, но вы получаете эту идею. – ShadowRanger 8 November 2017 в 05:41
  • 4

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

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

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

76
ответ дан Mark Rushakoff 18 August 2018 в 12:07
поделиться
  • 1
    Да, чтобы перечислить понимание. – hughdbrown 20 August 2009 в 01:29
  • 2
    Хммм. Может быть, должна быть общая проводка по спискам, генераторам, map (), zip () и множеству других быстрых итераций в python. – hughdbrown 20 August 2009 в 01:55
  • 3
    Я думаю, потому что это более подробный, вам нужно написать дополнительную переменную (дважды) ... Если операция более сложная, и вы в конечном итоге пишете лямбда, или вам нужно также отбросить некоторые элементы, я думаю, что понимание окончательно лучше чем карта + фильтр, но если у вас уже есть функция, которую вы хотите применить, карта более кратка. – fortran 25 June 2010 в 10:43
  • 4
    +1: проще читать & amp; позволяет использовать функции со многими параметрами – Le Droid 6 March 2014 в 23:55
  • 5

Функция отображения списка с возвратом имеет преимущество сохранения набора текста, особенно во время интерактивных сеансов. Вы можете определить функцию lmap (по аналогии с python2's 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
18
ответ дан Michael Goldshteyn 18 August 2018 в 12:07
поделиться

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

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

2
ответ дан ShadowRanger 18 August 2018 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: