Python string join: склейка элементов в строку
Метод join в Python объединяет элементы списка, кортежа или другого итерируемого объекта в одну строку, вставляя между ними заданный разделитель. Ниже разобраны синтаксис, поведение с разными коллекциями, способы склеить числа, причина ошибки TypeError и то, почему join быстрее сложения строк в цикле.

Содержание статьи
Синтаксис метода join()
Метод вызывается у строки-разделителя, а коллекция передается ему аргументом. Такой порядок кажется непривычным: логичнее было бы написать words.join(' '), но у списков метода join нет. Разделитель - это строка, и именно ей принадлежит метод.
separator.join(iterable)separator- строка, которая будет вставлена между элементами, может быть пустой;iterable- любой итерируемый объект, все элементы которого являются строками.
Метод возвращает новую строку и не изменяет ни разделитель, ни исходную коллекцию: строки в Python неизменяемы. Разделитель ставится только между элементами, в начале и в конце результата его нет.
words = ['Python', 'это', 'просто']
print(' '.join(words)) # Python это просто
print('-'.join(words)) # Python-это-просто
print(''.join(words)) # Pythonэтопросто
print(', '.join(['один'])) # один - разделитель не нужен
print(repr(', '.join([]))) # '' - пустая строка, не ошибкаJoin с разными типами коллекций
Аргументом может быть не только список. Метод перебирает любой объект, который поддерживает итерацию, поэтому результат зависит от того, что именно выдает перебор.
Кортеж и строка
Кортеж ведет себя так же, как список. Если передать строку, она перебирается посимвольно, и разделитель окажется между каждой парой символов.
print(' / '.join(('Москва', 'Тверь', 'Клин'))) # Москва / Тверь / Клин
print('-'.join('2026')) # 2-0-2-6
print('abc'.join('123')) # 1abc2abc3Последняя строка часто сбивает с толку: здесь 'abc' - разделитель, а '123' - коллекция из трех символов.
Множество
Множество не хранит порядок элементов, поэтому порядок в результирующей строке может отличаться от порядка записи и меняться между запусками программы. Если порядок важен, отсортируйте элементы заранее.
langs = {'Ruby', 'Python', 'Go'}
print(', '.join(sorted(langs))) # Go, Python, RubyСловарь
При переборе словаря Python выдает ключи, поэтому join склеит именно их. Чтобы объединить значения или пары, используйте методы values() и items().
user = {'name': 'Анна', 'city': 'Казань'}
print(', '.join(user)) # name, city
print(', '.join(user.values())) # Анна, Казань
print('; '.join(f'{k}={v}' for k, v in user.items()))
# name=Анна; city=КазаньПоследний прием удобен для сборки строки запроса или строки лога. Подробно о подстановке значений в шаблон рассказано в статье про f-строки.
Как склеить числа и другие нестроковые значения
Метод join принимает только строки. Если в коллекции окажется число, None или другой объект, Python выбросит исключение и укажет номер проблемного элемента.
nums = [10, 20, 30]
', '.join(nums)
# TypeError: sequence item 0: expected str instance, int foundПеред склейкой элементы приводят к строкам. Есть три равноценных способа, выбирайте тот, что читается проще в конкретном месте.
nums = [10, 20, 30]
print(', '.join(map(str, nums))) # 10, 20, 30
print(', '.join(str(n) for n in nums)) # то же через генератор
print(', '.join([f'{n:.1f}' for n in nums])) # 10.0, 20.0, 30.0Генератор или списковое включение нужны, когда числа требуется отформатировать: задать количество знаков после запятой, добавить единицы измерения или выровнять ширину. Если в данных встречается None, его можно отфильтровать условием: ' '.join(s for s in parts if s). Такой прием пригодится, например, при сборке ФИО, где отчество может отсутствовать.
Разделители: перенос строки, пробел, пустая строка
Разделителем может быть любая строка, включая управляющие символы. Чаще всего используют следующие варианты.
| Разделитель | Пример вызова | Для чего |
|---|---|---|
| Пробел | ' '.join(words) | Собрать предложение из слов |
| Пустая строка | ''.join(chars) | Склеить символы обратно в слово |
| Перенос строки | '\n'.join(lines) | Записать строки в файл или вывести столбиком |
| Запятая с пробелом | ', '.join(items) | Перечисление для пользователя |
| Табуляция | '\t'.join(row) | Строка таблицы в формате TSV |
lines = ['первая', 'вторая', 'третья']
with open('out.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(lines) + '\n') # последний перенос добавляем самиДля настоящих CSV-файлов с кавычками и запятыми внутри значений лучше подходит модуль csv: простая склейка через запятую не экранирует спецсимволы.
Join и split: обратные операции
Метод split() разбивает строку на список по разделителю, а join собирает список обратно. Вместе они позволяют быстро нормализовать текст, например убрать лишние пробелы или заменить один разделитель другим.
raw = ' много лишних пробелов '
print(' '.join(raw.split())) # много лишних пробелов
date = '31.10.2026'
print('-'.join(reversed(date.split('.')))) # 2026-10-31Вызов split() без аргументов делит по любым пробельным символам и отбрасывает пустые куски, поэтому связка с join убирает повторяющиеся пробелы в одну строку кода. Все варианты разбиения описаны в статье о методе split, а остальные операции со строками собраны в обзоре методов строк.
Почему join быстрее сложения строк
Строки неизменяемы, поэтому каждая операция s += part в цикле может создавать новую строку и копировать в нее все накопленное. Метод join сначала вычисляет итоговую длину, выделяет память один раз и копирует каждый фрагмент ровно один раз.
import timeit
parts = ['x'] * 100_000
def concat():
s = ''
for p in parts:
s += p
return s
print(timeit.timeit(concat, number=20))
print(timeit.timeit(lambda: ''.join(parts), number=20))На большинстве машин join оказывается быстрее в несколько раз. CPython умеет иногда оптимизировать += для строк, но это деталь реализации, на которую не стоит полагаться. Как правильно замерять скорость фрагментов кода, описано в материале о модуле timeit. Если нужно соединить две-три строки, оператор + или f-строка читаются лучше, и разница в скорости там несущественна.
У байтовых строк есть такой же метод: b', '.join([b'a', b'b']). Смешивать str и bytes в одном вызове нельзя. Описание метода приведено в документации Python.
Частые вопросы
Короткие ответы на вопросы о склейке строк.
Почему пишется ', '.join(list), а не list.join(', ')?
Метод join принадлежит строкам, а не спискам. Так он работает с любым итерируемым объектом: списком, кортежем, генератором, файлом, без отдельной реализации для каждого типа.
Как объединить список чисел в строку?
Приведите элементы к строкам: ''.join(map(str, [1, 2, 3])) даст '123', а с разделителем ', ' получится '1, 2, 3'.
Чем str.join отличается от os.path.join?
Это разные функции. os.path.join() собирает путь к файлу с учетом разделителя операционной системы и принимает части пути отдельными аргументами, а str.join() склеивает элементы коллекции через любую строку.
Что вернет join для пустого списка?
Пустую строку ''. Ошибки не будет, поэтому дополнительная проверка длины списка перед вызовом не нужна.