Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

list = map(str.strip, list) 

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

Ответ 2

Вы можете использовать методы списка

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

Ответ 3

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

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

Итак:

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

Ответ 4

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

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