Карта и функция возврата лямбда-функции [дубликат]

Другой вопрос был назван дубликатом этого:

В C ++ почему результат cout << x отличается от значения, которое показывает отладчик для x ?

x в вопросе - это переменная float.

Одним из примеров может быть

float x = 9.9F;

Отладчик показывает 9.89999962, вывод работы cout - 9.9.

Ответ оказывается, что точность cout по умолчанию для float равна 6, поэтому она округляется до шести десятичных цифры

См. здесь для справки

353
задан 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)
540
ответ дан Triptych 27 August 2018 в 14:51
поделиться

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

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

В дополнение к приведенным выше ответам в 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 27 August 2018 в 14:51
поделиться
list(map(chr, [66, 53, 0, 94]))

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

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

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

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

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

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

0
ответ дан Invader 27 August 2018 в 14:51
поделиться

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

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

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

56
ответ дан Israel Unterman 27 August 2018 в 14:51
поделиться

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

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

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

76
ответ дан Mark Rushakoff 27 August 2018 в 14:51
поделиться

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

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

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