Поскольку указанный ниже цикл изменяет только элементы, которые уже видны, это будет считаться приемлемым:
a = ['a',' b', 'c ', ' d ']
for i, s in enumerate(a):
a[i] = s.strip()
print(a) # -> ['a', 'b', 'c', 'd']
Что отличается от:
a[:] = [s.strip() for s in a]
в том смысле, что он не требует создания временного списка и его назначения для замены оригинала, хотя для этого требуется больше операций индексирования.
Внимание: Хотя вы можете изменять записи таким образом, вы не можете изменить количество элементов в list
, не рискуя столкнуться с проблемами.
Вот пример того, что я имею в виду - удаление записи портит индексацию с этого момента:
b = ['a', ' b', 'c ', ' d ']
for i, s in enumerate(b):
if s.strip() != b[i]: # leading or trailing whitespace?
del b[i]
print(b) # -> ['a', 'c '] # WRONG!
(Результат неверный, потому что он не удалил все элементы, которые он должен иметь.)
Обновление
Поскольку это довольно популярный ответ, вот как эффективно удалять записи «на месте» (хотя это не совсем вопрос):
b = ['a',' b', 'c ', ' d ']
b[:] = [entry for entry in b if entry.strip() == entry]
print(b) # -> ['a'] # CORRECT