Как объединить элементы списка в одну строку в Python?
У меня список слов, и я хочу склеить их в одну строку через пробел (или через запятую). Пробую складывать через +, выходит коряво. Как правильно собрать список в строку?
2 ответа
Правильный инструмент — метод join. Он вызывается у строки-разделителя, а список передаётся в скобках:
words = ['привет', 'как', 'дела']
print(' '.join(words)) # 'привет как дела'
print(', '.join(words)) # 'привет, как дела'
print(''.join(words)) # 'приветкакдела' — без разделителя
Логика непривычная, но запоминается: разделитель «соединяет» элементы, поэтому он слева — 'разделитель'.join(список), а не список.join('разделитель').
Главная ловушка — join склеивает только строки. Если в списке числа, будет TypeError: sequence item 0: expected str, not int. Сначала превратите элементы в строки:
nums = [1, 2, 3]
print('-'.join(str(x) for x in nums)) # '1-2-3'
Здесь генератор str(x) for x in nums на лету конвертирует числа.
Почему не через +: складывать строки в цикле (s = s + word) и неудобно (нужно вручную вставлять пробелы), и медленно на больших списках — каждая операция создаёт новую строку. join делает всё за один проход и оптимизирован.
И обратная операция — split(): 'привет как дела'.split() вернёт список слов. split и join — пара противоположностей.
Если нужно склеить с переводами строк (каждый элемент на своей строке), разделителем будет '\n':
lines = ['строка1', 'строка2', 'строка3']
text = '\n'.join(lines)
print(text)
Это, кстати, удобный способ подготовить текст для записи в файл одним f.write(text). И ещё: если элементы могут быть разных типов, безопаснее сразу '\n'.join(map(str, lines)), чтобы join не споткнулся на числе.