Python: уроки, справочник и задачи

Python string join: склейка элементов в строку

Раздел: Строки в Python · Обновлено 31.10.2026

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

Python string join: склейка элементов в строку
Фото: Niabot / CC BY-SA 3.0, Wikimedia Commons
Содержание статьи
  1. Синтаксис метода join()
  2. Join с разными типами коллекций
    1. Кортеж и строка
    2. Множество
    3. Словарь
  3. Как склеить числа и другие нестроковые значения
  4. Разделители: перенос строки, пробел, пустая строка
  5. Join и split: обратные операции
  6. Почему join быстрее сложения строк
  7. Частые вопросы
    1. Почему пишется ', '.join(list), а не list.join(', ')?
    2. Как объединить список чисел в строку?
    3. Чем str.join отличается от os.path.join?
    4. Что вернет join для пустого списка?

Синтаксис метода join()

Метод вызывается у строки-разделителя, а коллекция передается ему аргументом. Такой порядок кажется непривычным: логичнее было бы написать words.join(' '), но у списков метода join нет. Разделитель - это строка, и именно ей принадлежит метод.

separator.join(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 для пустого списка?

Пустую строку ''. Ошибки не будет, поэтому дополнительная проверка длины списка перед вызовом не нужна.