Почему split(',') возвращает пустые строки — пример с 'a,b,,c,'

Почему split(',') возвращает пустые строки — пример с 'a,b,,c,'

@python_quiz

Разберем этот квиз

Коротко: при явном указании разделителя в str.split каждое вхождение разделителя разделяет строку, и пустые элементы между соседними разделителями или после последнего разделителя сохраняются. Это объясняет поведение кода в задании.

Условие — код из квиза

python

Давайте разберёмся, что происходит шаг за шагом.

Разбор строки и логика split

Строка s содержит четыре запятые:

  • между 'a' и 'b'
  • между 'b' и '' (две запятых подряд)
  • между '' и 'c'
  • после 'c' (трейлинг-запятая)

Общее правило: если вы вызываете split(sep), то разделитель используется буквально, и пустые подстроки между соседними разделителями и в конце строки не удаляются. При N разделителях получится N+1 частей.

Здесь N = 4 => частей = 5.

Явные части:

  • 'a'
  • 'b'
  • '' (пустая, между ,,)
  • 'c'
  • '' (пустая, после завершающей запятой)

Поэтому len(parts) == 5, а parts[-1] == '' будет True.

Демонстрация (исполнение)

python

Вывод этого фрагмента: 5 True (в строке печати показано и содержимое parts).

Почему не другие варианты

  • Вариант с длиной 4 ошибается в подсчёте частей: при 4 разделителях должно быть 5 частей.
  • Вариант с длиной 5 и ложным значением для проверки последнего элемента неверно оценивает последний элемент: он пустая строка, поэтому проверка равенства с '' возвращает True.
  • Вариант с длиной 6 предполагает лишнюю часть — это не соответствует числу разделителей в строке.

Именно сочетание подсчёта частей (разделители + 1) и сохранения пустых подстрок при split(sep) даёт ожидаемый результат.

Что делать, если пустые элементы не нужны

Если вам нужно отбросить пустые строки, есть несколько подходов:

  • Фильтрация с помощью list comprehension:
python
  • Использовать filter:
python
  • Если нужно игнорировать только пустые в начале/в конце, можно применять .strip или обрабатывать границы отдельно.

Примеры:

python

Выбор способа зависит от того, хотите ли вы удалять только пустые строки полностью или, например, сохранять строки, состоящие из пробелов (в этом случае фильтр по truthiness удалит и их).

Вывод

При вызове split с явно указанным разделителем пустые части между соседними разделителями и после завершающего разделителя сохраняются. В рассматриваемом примере получается 5 частей, и последний элемент — пустая строка, поэтому выражение, сравнивающее его с '', даёт True.

Report Page