Начиная с Python3 и далее
map
больше не возвращает list
, а mapObject
, поэтому ответ будет выглядеть примерно так:
>>> map(lambda x:x.strip(),l)
<map object at 0x7f00b1839fd0>
Подробнее об этом можно прочитать на Что нового в Python 3.0 .
map()
и filter()
возвращают итераторы.Если вам действительно нужен list
, быстрое исправление, например, list(map(...))
Итак, каковы способы получения этого?
Случай 1 - list
вызов по map
с lambda
map
возвращает итератор .list
- это функция, которая может преобразовывать итератор в список.Следовательно, вам нужно будет обернуть list
вызов вокруг map
.Таким образом, ответ теперь становится:
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> list(map(lambda x:x.strip(),l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Очень хорошо, мы получаем вывод.Теперь мы проверяем количество времени, которое требуется для выполнения этого фрагмента кода.
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(lambda x:x.strip(),l))"
100000 loops, best of 3: 2.22 usec per loop
2,22 микросекунды.Это не так плохо.Но есть ли более эффективные способы?
Случай 2 - list
вызов по map
без lambda
lambda
не одобряется многими в сообществе Python (включая Гвидо ).Кроме того, это значительно снизит скорость работы программы.Следовательно, мы должны избегать этого в максимально возможной степени.Функция верхнего уровня str.strip
.На помощь приходит сюда.
map
можно переписать без использования lambda
, используя str.strip
как
>>> list(map(str.strip,l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
А теперь для времени.
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(str.strip,l))"
1000000 loops, best of 3: 1.38 usec per loop
Фантастика.Вы можете увидеть различия в эффективности между двумя способами.Это почти на 60% быстрее.Таким образом, подход без использования lambda
является лучшим выбором здесь.
Случай 3 - Следование рекомендациям, Обычный способ
Еще один важный момент из Что нового в Python 3.0 заключается в том, что он советует нам избегать map
, где это возможно.
Особенно сложно map()
вызывать для побочных эффектовфункция;правильное преобразование - использовать обычный цикл for
(поскольку создание списка будет просто расточительным).
Таким образом, мы можем решить эту проблему без map
, используя обычный for
петля.
Тривиальным способом решения (грубой силой) будет: -
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> final_list = []
>>> for i in l:
... final_list.append(i.strip())
...
>>> final_list
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Настройка времени
def f():
l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
final_list = []
for i in l:
final_list.append(i.strip())
import timeit
print(min(timeit.repeat("f()","from __main__ import f")))
И результат.
1.5322505849981098
Как видите, грубая сила здесь немного медленнее.Но он определенно более читабелен для обычного программиста, чем предложение map
.
Случай 4 - Понимания списка
A Понимание списка здесь также возможно и аналогичнов Python2.
>>> [i.strip() for i in l]
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Теперь по таймингу:
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];[i.strip() for i in l]"
1000000 loops, best of 3: 1.28 usec per loop
Как видите, понимание списка более эффективно, чем map
(даже без lambda
), Следовательно, правило большого пальца в Python3 состоит в том, чтобы использовать понимание списка вместо map
Случай 5 - на местемеханизмы и эффективность использования пространства ( TMT )
Последний способ - внести изменения на месте в самом списке.Это сэкономит много места в памяти.Это можно сделать, используя enumerate
.
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> for i,s in enumerate(l):
... l[i] = s.strip()
...
>>> l
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Результат синхронизации будет 1.4806894720022683
.Но, тем не менее, этот способ эффективен в пространстве.
Заключение
Сравнительный список таймингов (как Python 3.4.3, так и Python 3.5.0)
----------------------------------------------------
|Case| method | Py3.4 |Place| Py3.5 |Place|
|----|-----------------|-------|-----|-------|-----|
| 1 | map with lambda | 2.22u | 5 | 2.85u | 5 |
| 2 | map w/o lambda | 1.38u | 2 | 2.00u | 2 |
| 3 | brute-force | 1.53u | 4 | 2.22u | 4 |
| 4 | list comp | 1.28u | 1 | 1.25u | 1 |
| 5 | in-place | 1.48u | 3 | 2.14u | 3 |
----------------------------------------------------
Наконец, обратите внимание, что понимание списка - лучший способ, а map
с использованием lambda
- худший.Но опять же --- ТОЛЬКО В PYTHON3