Объединить элемент в списке в строки

576

Есть ли более простой способ объединить строковые элементы в списке в одну строку? Могу ли я использовать str.join()функцию?

Например, это вход, ['this','is','a','sentence']и это желаемый выходthis-is-a-sentence

sentence = ['this','is','a','sentence']
sent_str = ""
for i in sentence:
    sent_str += str(i) + "-"
sent_str = sent_str[:-1]
print sent_str
Alvas
источник
24
'-'.join(sentence)
Аландские

Ответы:

1054

Используйте join:

>>> sentence = ['this','is','a','sentence']
>>> '-'.join(sentence)
'this-is-a-sentence'
Бурхан Халид
источник
13
Не понял, что слева должно быть "-" ??
Лоуренс ДеСуза
5
@LawrenceDeSouza Строка, к которой вы хотите присоединиться; см. документацию или этот ответ, который более подробно описан.
Бурхан Халид
9
Я вроде как ожидал sentence.join(" ")работать, так как обратная операция есть list.split(" "). Любая идея, если это будет добавлено в методы Python для списков?
Воутер Тилен
10
@ Ваутер, этого не будет. С одной стороны, могут быть объединены только списки строк; так list.joinбыло бы неуместно для произвольного списка. С другой стороны, аргументом str.joinможет быть любая «итеративная» последовательность строк, а не просто список. Единственное, что имело бы смысл - это встроенная функция join(list, sep); есть один в (в основном устаревший) stringмодуль, если вы действительно этого хотите.
Алексис
4
@Leo' '.join(['this', 'is', 'a', 'sentence'])
Бурхан Халид
120

Более общий способ преобразования списков Python в строки:

>>> my_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> my_lst_str = ''.join(map(str, my_lst))
>>> print(my_lst_str)
'12345678910'
6 упак. Малыш
источник
3
Почему понимание списка необходимо, когда ввод является строкой? также map(str, my_lst)было бы достаточно без перечисления списка =)
alvas
5
В большинстве ответов на этот вопрос рассматривается случай, когда в списке есть строки. Мой - это общий способ преобразования списков в строки. В моем примере список имеет тип, intно это может быть любой тип, который может быть представлен в виде строки.
6шт ребенок
3
Чтобы добавить к этому, карта также будет полезна при использовании с лямбда-функцией. Например ' '.join(map(lambda x: ' $'+ str(x), my_lst)), вернется'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10'
ScottMcC
3
добавление карты действительно помогает с типами данных, кроме строки. Большой!
appleboy
40

Для начинающих очень полезно знать, почему соединение является строковым методом .

Это очень странно в начале, но очень полезно после этого.

Результатом объединения всегда является строка, но объединяемый объект может быть разных типов (генераторы, списки, кортежи и т. Д.).

.joinбыстрее, потому что он выделяет память только один раз. Лучше, чем классическая конкатенация (см. Расширенное объяснение ).

Как только вы изучите это, это будет очень удобно, и вы можете делать такие трюки, чтобы добавить скобки.

>>> ",".join("12345").join(("(",")"))
Out:
'(1,2,3,4,5)'

>>> list = ["(",")"]
>>> ",".join("12345").join(list)
Out:
'(1,2,3,4,5)'
Wallebot
источник
12

Хотя ответ @Burhan Khalid хорош, я думаю, что это более понятно:

from str import join

sentence = ['this','is','a','sentence']

join(sentence, "-") 

Второй аргумент для join () является необязательным и по умолчанию "".

РЕДАКТИРОВАТЬ: эта функция была удалена в Python 3

SilentVoid
источник
14
Эта функция устарела в 2.x и будет удалена в 3.x. В таком случае, я бы не рекомендовал использовать это поверх другого ответа.
Мэтью Грин
@ Mathew Green этот ответ и ответ Burhan Khalid по-разному используют одну и ту же функцию, поэтому его ответ также не рекомендуется. Но спасибо, что указали на это, поймите, как присоединиться к 3.x. Но если вы используете 2.x, он не уйдет.
SilentVoid
1
Его не считается устаревшим. Ваша рекомендация использует функцию из Lib / string.py, которая полностью отличается и не рекомендуется, тогда как в ответе @BurhanKhalid используется встроенный метод строки, который не рекомендуется. Его ответ является наиболее правильным на данный момент и будет продолжаться, в то время как на 2.x это пока хорошо.
Мэтью Грин
Все это говорит о том, что если вы хотите продвигать эту альтернативу, вы должны также включить предупреждение, что это не рекомендуется по причинам, изложенным в моих предыдущих комментариях.
Мэтью Грин
2

Мы можем указать, как мы должны присоединиться к строке. Вместо «-» мы можем использовать «»

sentence = ['this','is','a','sentence']
s=(" ".join(sentence))
print(s)
Абхишек В.
источник
2

Мы также можем использовать функцию уменьшения Python :

from functools import reduce

sentence = ['this','is','a','sentence']
out_str = str(reduce(lambda x,y: x+"-"+y, sentence))
print(out_str)
Нишкарш Диксит
источник
4
Слишком много ненужных сложностей, почему бы просто не использовать join?
Себастьян Пальма
-1
def eggs(someParameter):
    del spam[3]
    someParameter.insert(3, ' and cats.')


spam = ['apples', 'bananas', 'tofu', 'cats']
eggs(spam)
spam =(','.join(spam))
print(spam)
Pyte
источник
2
Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
alan.elkin