Другой вопрос был назван дубликатом этого:
В C ++ почему результат cout << x
отличается от значения, которое показывает отладчик для x
?
x
в вопросе - это переменная float
.
Одним из примеров может быть
float x = 9.9F;
Отладчик показывает 9.89999962
, вывод работы cout
- 9.9
.
Ответ оказывается, что точность cout
по умолчанию для float
равна 6, поэтому она округляется до шести десятичных цифры
См. здесь для справки
Сделайте это:
list(map(chr,[66,53,0,94]))
В Python 3+ многие процессы, которые перебирают итераторы, возвращают сами итераторы. В большинстве случаев это приводит к экономии памяти и ускоряет работу.
Если все, что вам нужно сделать, это перебрать этот список в конце концов, нет необходимости даже преобразовывать его в список, потому что вы все равно можете перебирать объект map
следующим образом:
# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
print(ch)
Я не знаком с Python 3.1, но будет ли это работать?
[chr(x) for x in [66, 53, 0, 94]]
В дополнение к приведенным выше ответам в 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]
list(map(chr, [66, 53, 0, 94]))
map (func, * iterables) -> map object Сделать итератор, который вычисляет функцию, используя аргументы из каждого из iterables. Остановка, когда исчерпана самая короткая итерация.
«Сделать итератор»
blockquote>означает, что он вернет итератор.
", который вычисляет функцию с использованием аргументов из каждого из итераций "
blockquote>означает, что функция next () итератора будет принимать одно значение каждого итератора и передавать каждый из них в один позиционный параметр function.
Итак, вы получаете итератор из map () funtion и jsut передаете его в список () встроенную функцию или используете списки.
Новый и опрятный в Python 3.5:
[*map(chr, [66, 53, 0, 94])]
Благодаря Дополнительные распаковывающие обобщения
Почему вы этого не делаете:
[chr(x) for x in [66,53,0,94]]
Это называется пониманием списка. Вы можете найти много информации о Google, но вот ссылка на документацию Python (2.6) на понимание списков . Однако вас может заинтересовать документация Python 3 .
Функция отображения списка с возвратом имеет преимущество сохранения набора текста, особенно во время интерактивных сеансов. Вы можете определить функцию 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
blockquote>Возможно, это , но это очень плохая идея. Просто для удовольствия, вот как вы можете (но не должны) делать это:
__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
Преобразование моего старого комментария для лучшей видимости: для «лучшего способа сделать это» без 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
).