Перейти к содержанию

432 уроков, 26 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 16 из 20 Начальный 15 мин 100 XP

Join и split в Python: строка и список

Данные приходят строкой «молоко,хлеб,сыр», а работать с ними удобнее списком. split режет строку на части, join склеивает обратно — мост между двумя мирами.

Редакция Питоники

Данные в программах живут в двух мирах. Внутри программы — списками: товары, цены, результаты вычислений. Снаружи — строками: строки CSV-файла, записи лога, строчка из формы. Между мирами нужен мост в обе стороны: split разбирает строку в список, join собирает список обратно в строку. Оба принадлежат строкам, а не спискам, и оба понадобятся в проекте раздела, где инвентарь магазина придёт текстом.

split: строка разбирается в список

Метод split принимает разделитель и возвращает список частей — кусков строки между разделителями. Разделитель в результат не попадает:

split по разделителю
row = 'а-б-в'
parts = row.split('-')
print(parts)
print(len(parts))
print(type(parts).__name__)
Вывод
['а', 'б', 'в']
3
list

Вызов без аргумента режет по пробельным символам — пробелам, табам, переводам строк — и пустые части между ними выбрасывает. Для разбора обычного текста это самый частый вызов:

split без аргумента: по пробелам
line = 'раз   два  три'
print(line.split())

csv = 'молоко, хлеб, сыр'
print(csv.split(', '))
Вывод
['раз', 'два', 'три']
['молоко', 'хлеб', 'сыр']

Обратите внимание на разницу: split() проглотил подряд три пробела и вернул три слова, а split(', ') режет строго по паре запятая-пробел — разделитель обязан совпадать посимвольно. Строковые методы в общем виде разобраны в курсе про строки; здесь важен именно мост в списки.

join: список собирается в строку

Обратная поездка делается методом join, и вызывается он не у списка, а у строки-разделителя: разделитель слева, список в скобках. Между элементами вставляется ровно один разделитель:

join с разделителем
parts = ['молоко', 'хлеб', 'сыр']
print(','.join(parts))
print(' -> '.join(parts))
Вывод
молоко,хлеб,сыр
молоко -> хлеб -> сыр

Между элементами вставляется ровно один разделитель, и сам он в элементы не попадает. Строки с пробелами вокруг разделителя — « -> », « | » — делают читаемый вывод отчётов, а сцепка с пустым разделителем ''.join склеивает части вплотную — так собирают слово из букв:

join без разделителя
print(''.join(['а', 'б', 'в']))
print('отчёт: ' + ' | '.join(['молоко', 'хлеб']))
Вывод
абв
отчёт: молоко | хлеб

Крайний случай на всякий случай: join от пустого списка вернёт пустую строку — вставлять разделитель не между чем. Метод не падает и не требует проверок: пустой вход — пустой выход.

Числа в строку: str и comprehension

Цены и остатки в программах — числа, а join строк не принимает. Мост строится comprehension из урока про генераторы списков: [str(n) for n in nums] даёт список строк, который join принимает спокойно:

числа проходят через str
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 собирает через один.

splitjoin
Куда едетСтрока превращается в списокСписок превращается в строку
У кого живётМетод строкиМетод строки-разделителя
РазделительАргумент: s.split('-')Слева: ','.join(parts)
Крайний случайПустые части при двойном разделителеTypeError, если элементы не строки
как записи приходят из файла
rows = []
with open('cart.csv', encoding='utf-8') as f:
    for line in f:
        rows.append(line.strip().split(','))
В песочнице файлов нет, поэтому блок не запускается: он показывает мост из настоящей программы. Каждая строка файла режется split-ом в список частей — strip перед этим срезает перевод строки. Дальше вся обработка остаётся списочной.

Строки файла — те же данные, что и в примерах урока: 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))
Проверь себя
0 / 6

1. Что вернёт 'а-б-в'.split('-')?

2. У кого вызывается join?

3. Что произойдёт при ','.join([89, 45])?

4. Что вернёт 'а--б'.split('-')?

5. Чем split() без аргумента отличается от split(' ')?

6. Как получить список чисел из строки '89,45,520'?

Карточки терминов
Запомнено: 0 / 7
Практика

Дана строка cart = 'молоко,хлеб,сыр,хлеб'. Разберите её в список, посчитайте, сколько в ней позиций, и соберите список обратно в строку через разделитель «; » (точка с запятой и пробел). Напечатайте список, число позиций и новую строку.

practice.py
Вопросы и ответы по уроку

Как разбить строку на список в 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-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.