Join и split в Python: строка и список
Данные приходят строкой «молоко,хлеб,сыр», а работать с ними удобнее списком. split режет строку на части, join склеивает обратно — мост между двумя мирами.
Редакция Питоники
Данные в программах живут в двух мирах. Внутри программы — списками: товары, цены, результаты вычислений. Снаружи — строками: строки CSV-файла, записи лога, строчка из формы. Между мирами нужен мост в обе стороны: split разбирает строку в список, join собирает список обратно в строку. Оба принадлежат строкам, а не спискам, и оба понадобятся в проекте раздела, где инвентарь магазина придёт текстом.
split: строка разбирается в список
Метод split принимает разделитель и возвращает список частей — кусков строки между разделителями. Разделитель в результат не попадает:
row = 'а-б-в'
parts = row.split('-')
print(parts)
print(len(parts))
print(type(parts).__name__)
['а', 'б', 'в'] 3 list
Вызов без аргумента режет по пробельным символам — пробелам, табам, переводам строк — и пустые части между ними выбрасывает. Для разбора обычного текста это самый частый вызов:
line = 'раз два три'
print(line.split())
csv = 'молоко, хлеб, сыр'
print(csv.split(', '))
['раз', 'два', 'три'] ['молоко', 'хлеб', 'сыр']
Обратите внимание на разницу: split() проглотил подряд три пробела и вернул три слова, а split(', ') режет строго по паре запятая-пробел — разделитель обязан совпадать посимвольно. Строковые методы в общем виде разобраны в курсе про строки; здесь важен именно мост в списки.
join: список собирается в строку
Обратная поездка делается методом join, и вызывается он не у списка, а у строки-разделителя: разделитель слева, список в скобках. Между элементами вставляется ровно один разделитель:
parts = ['молоко', 'хлеб', 'сыр']
print(','.join(parts))
print(' -> '.join(parts))
молоко,хлеб,сыр молоко -> хлеб -> сыр
Между элементами вставляется ровно один разделитель, и сам он в элементы не попадает. Строки с пробелами вокруг разделителя — « -> », « | » — делают читаемый вывод отчётов, а сцепка с пустым разделителем ''.join склеивает части вплотную — так собирают слово из букв:
print(''.join(['а', 'б', 'в']))
print('отчёт: ' + ' | '.join(['молоко', 'хлеб']))
абв отчёт: молоко | хлеб
Крайний случай на всякий случай: join от пустого списка вернёт пустую строку — вставлять разделитель не между чем. Метод не падает и не требует проверок: пустой вход — пустой выход.
Числа в строку: str и comprehension
Цены и остатки в программах — числа, а join строк не принимает. Мост строится comprehension из урока про генераторы списков: [str(n) for n in nums] даёт список строк, который join принимает спокойно:
nums = [89, 45, 520]
try:
print(','.join(nums))
except TypeError as e:
print('Ошибка:', e)
text = ','.join([str(n) for n in nums])
print(text)
back = [int(x) for x in text.split(',')]
print(back)
print(sum(back))
Ошибка: sequence item 0: expected str instance, int found 89,45,520 [89, 45, 520] 654
Круг замкнулся: числа стали строкой через str и join, строка вернулась числами через split и int в comprehension. Сумма 654 подтверждает, что обратная поездка не потеряла данные. Пара таких преобразований — стандартный способ передать список чисел между программами и частями отчёта.
Разбор записи: split плюс распаковка
Типовая строка реальных данных выглядит как запись: имя:цена:остаток. split отдаёт ровно столько частей, сколько разделителей минус один, и каждая часть ложится в свою переменную через распаковку из урока про звёздочку:
record = 'молоко:89:12'
name, price, qty = record.split(':')
print(name, '-', price, 'руб,', qty, 'шт')
print(int(price) * int(qty))
молоко - 89 руб, 12 шт 1068
Никаких индексов: split вернул список из трёх частей, распаковка разложила их по именам, и дальше переменные живут своей жизнью. Цены после разборка — строки, поэтому перед умножением стоит int. Тот же шаблон разбора записи появится в проекте: там записей будет шесть.
Ловушка: пустые части
split честен до конца: два разделителя подряд дают пустую строку между ними, и она попадает в список. Это не ошибка метода — просто данные с двойным разделителем:
print('а--б'.split('-'))
print(' а б '.split())
dirty = 'молоко,,сыр'
clean = [x for x in dirty.split(',') if x]
print(clean)
['а', '', 'б'] ['а', 'б'] ['молоко', 'сыр']
Вторая строка примера — важное отличие: split() без аргумента пустые части не возвращает, а split с явным разделителем возвращает. Отфильтровать пустышки от явного разделителя помогает comprehension с if из урока про фильтры — одна строка вместо цикла с проверками. А обратный трюк ' '.join(line.split()) чистит строку от лишних пробелов целиком: split без аргумента режет по всем пробелам сразу, join собирает через один.
| split | join | |
|---|---|---|
| Куда едет | Строка превращается в список | Список превращается в строку |
| У кого живёт | Метод строки | Метод строки-разделителя |
| Разделитель | Аргумент: s.split('-') | Слева: ','.join(parts) |
| Крайний случай | Пустые части при двойном разделителе | TypeError, если элементы не строки |
rows = []
with open('cart.csv', encoding='utf-8') as f:
for line in f:
rows.append(line.strip().split(','))
Строки файла — те же данные, что и в примерах урока: strip срезал мусор по краям, split отрезал разделитель, и программа продолжила работу в мире списков. Полную карту методов строк показывает курс про строки, а карта методов самого списка — в следующем уроке.
Сначала предскажи ответ в голове — это главный навык программиста.
s = 'раз два три'
parts = s.split()
print(len(parts))
print('-'.join(parts))
record = 'хлеб:45:30'
name, price, qty = record.split(':')
print(name, int(price) + int(qty))
nums = [1, 2, 3]
text = ''.join([str(n) for n in nums])
print(text, len(text))
1. Что вернёт 'а-б-в'.split('-')?
2. У кого вызывается join?
3. Что произойдёт при ','.join([89, 45])?
4. Что вернёт 'а--б'.split('-')?
5. Чем split() без аргумента отличается от split(' ')?
6. Как получить список чисел из строки '89,45,520'?
Дана строка cart = 'молоко,хлеб,сыр,хлеб'. Разберите её в список, посчитайте, сколько в ней позиций, и соберите список обратно в строку через разделитель «; » (точка с запятой и пробел). Напечатайте список, число позиций и новую строку.
Как разбить строку на список в Python?
Методом split: 'а-б-в'.split('-') даёт ['а', 'б', 'в'] — части между разделителями. Вызов без аргумента режет по любым пробелам подряд. Запись вида имя:цена удобна разбирать с распаковкой: name, price = record.split(':').
Урок 16: join и splitКак превратить список в строку?
Методом join у строки-разделителя: ','.join(['молоко', 'хлеб']) даёт 'молоко,хлеб'. Элементы обязаны быть строками — список чисел сначала проходит comprehension [str(n) for n in nums]. Обратный разбор — s.split(',').
Почему join не работает со списком чисел?
join умеет склеивать только строки и при встрече числа бросает TypeError: sequence item 0: expected str instance, int found. Числа нужно заранее превратить в строки: ','.join([str(n) for n in nums]) — и строка готова.
Что делает split() без аргумента?
Делит строку по любым пробельным символам — пробелам, табам, переводам строк — глотая их подряд и отбрасывая пустые части. 'раз два'.split() даст ['раз', 'два']. Это же свойство чистит текст трюком ' '.join(s.split()).
Курс про строкиПонравился урок? Сошлитесь на него
«split разбирает строку в список, join собирает список обратно в строку.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Списки · Урок 12
List comprehension в Python: генератор списков
Задача из списка цен получить список скидок повторяется постоянно — и решается одной формулой вместо цикла из трёх строк. Разбираем list comprehension по частям: выражение, источник и почему исходный список остаётся цел.
Списки · Урок 13
Comprehension с условием if: фильтр списка в Python
В новый список часто нужны не все элементы, а только подходящие: чётные числа, дорогие товары, имена на нужную букву. Условие if внутри comprehension фильтрует список одной строкой — а вот if-else делает другое, и путать их нельзя.
Списки · Урок 20
Проект на Python: инвентарь магазина на списках
Финальный проект: маленький магазин — товары, цены и остатки в трёх параллельных списках. zip собирает записи, sum и max считают агрегаты, сортировка даёт топ, comprehension находит дефицит — и всё складывается в отчёт.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Строки · Урок 9
split: разобрать строку
Одна строка данных редко живёт одна: CSV-запись, строка лога, поля формы. Метод split режет строку по разделителю и возвращает список частей — разбираем все варианты, от запятой до splitlines.
split pythonsplit в python
Строки · Урок 10
join: собрать строку из частей
split разбирает строку на части, join собирает обратно: разделитель, список строк — и одна готовая строка вместо десяти склеек плюсом. Разбираем синтаксис и главный вопрос: почему не плюс.
join pythonjoin в python
Списки · Урок 8
in в Python: есть ли элемент в списке
Один оператор вместо цикла с флагом: in задаёт списку вопрос есть ли элемент и отвечает True или False. Разбираем ответ, перевёрнутый not in и коварное сравнение целиком.
python список in