Есть ли лучший способ использовать strip () в списке строк? - python [дубликат]

этот вопрос уже есть ответ здесь:

пока я пытался выполнить strip () в списке строк, и я сделал это:

i = 0
for j in alist:
    alist[i] = j.strip()
    i+=1

есть ли лучший способ сделать это?

4 ответов


вы, вероятно, не должны использовать list в имя переменной, так как это тип. Независимо:

list = map(str.strip, list) 

это будет применять функцию str.strip для каждого элемента в list, верните новый список и сохраните результат в list.


вы можете использовать list comprehensions

stripped_list = [j.strip() for j in initial_list]

некоторые интригующие обсуждения производительности произошли здесь, поэтому позвольте мне предоставить эталон:

http://ideone.com/ldId8

noslice_map              : 0.0814900398254
slice_map                : 0.084676027298
noslice_comprehension    : 0.0927240848541
slice_comprehension      : 0.124806165695
iter_manual              : 0.133514881134
iter_enumerate           : 0.142778873444
iter_range               : 0.160353899002

так:

  1. map(str.strip, my_list) Это самый быстрый способ, это просто немного быстрее, чем comperhensions.
    • использовать map или itertools.imap Если есть одна функция, которую вы хотите применить (например, str.сплит)
    • используйте понимания, если есть более сложный выражение
  2. ручная итерация-самый медленный способ; разумное объяснение заключается в том, что для интерпретатора требуется больше работы, а эффективная среда выполнения C делает меньше
  3. вперед и назначить результат, как my_list[:] = map..., нотация среза вводит только небольшие накладные расходы и, вероятно, избавит вас от некоторых ошибок, если есть несколько ссылок на этот список.
    • знайте разницу между мутированием списка и повторным созданием он.

Я думаю, вы имеете в виду

a_list = [s.strip() for s in a_list]

использование выражения генератора может быть лучшим подходом, например:

stripped_list = (s.strip() for s in a_list)

предлагает преимущество ленивой оценки, поэтому strip запускается только тогда, когда данный элемент, разделенный, необходим.

если вам нужны ссылки на список, чтобы оставаться нетронутыми вне текущей области, вы можете использовать синтаксис среза списка.:

a_list[:] = [s.strip() for s in a_list]

для комментаторов, заинтересованных в скорости различных подходов, это выглядит так, как будто в CPython подход "генератор-срез" наименее эффективен:

>>> from timeit import timeit as t
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""")
4.35184121131897
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""")
2.9129951000213623
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""")
2.47947096824646