Połącz element na liście z łańcuchami

574

Czy istnieje prostszy sposób na połączenie elementów łańcucha na liście w pojedynczy łańcuch? Czy mogę korzystać z str.join()funkcji?

Np. To jest wejście ['this','is','a','sentence']i to jest pożądane wyjściethis-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
źródło
24
'-'.join(sentence)
i

Odpowiedzi:

1051

Użyj join:

>>> sentence = ['this','is','a','sentence']
>>> '-'.join(sentence)
'this-is-a-sentence'
Burhan Khalid
źródło
13
Nie rozumiem, co to ma być „-” po lewej stronie?
Lawrence DeSouza
5
@LawrenceDeSouza Ciąg, do którego chcesz dołączyć; zobacz dokumentację lub tę odpowiedź, która zawiera nieco więcej szczegółów.
Burhan Khalid
9
Oczekiwałem też, sentence.join(" ")że zadziała, ponieważ działa odwrotnie list.split(" "). Masz pomysł, czy zostanie to dodane do metod Pythona dla list?
Wouter Thielen,
10
@ Wouter, nie będzie. Z jednej strony można łączyć tylko listy ciągów; więc list.joinbyłoby niewłaściwe dla dowolnej listy. Z drugiej strony argumentem str.joinmoże być dowolna „ciągowa” sekwencja ciągów, a nie tylko lista. Jedyne, co miałoby sens, to wbudowana funkcja join(list, sep); jest jeden w (zasadniczo przestarzałym) stringmodule, jeśli naprawdę tego chcesz.
Alexis
4
@Leo' '.join(['this', 'is', 'a', 'sentence'])
Burhan Khalid
120

Bardziej ogólny sposób konwersji list pythonowych na ciągi znaków to:

>>> 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-pak dzieci
źródło
3
dlaczego konieczne jest zrozumienie listy, gdy dane wejściowe są ciągiem znaków? również map(str, my_lst)będzie wystarczająco bez wyliczanie listy =)
alvas
5
Większość odpowiedzi na to pytanie dotyczy przypadku, gdy lista zawiera ciągi znaków. Mój to ogólny sposób konwersji list na ciągi. W moim przykładzie lista jest typu, intale może to być dowolny typ, który może być reprezentowany jako ciąg.
6
3
Aby dodać do tego, mapa byłaby również przydatna, gdy jest używana z funkcją lambda. Na przykład ' '.join(map(lambda x: ' $'+ str(x), my_lst))wróciłby'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10'
ScottMcC
3
dodanie mapy faktycznie pomaga w przypadku typów danych oprócz łańcucha. Świetny!
appleboy
39

Dla początkujących bardzo przydatne jest ustalenie, dlaczego join jest metodą strunową .

Na początku jest to bardzo dziwne, ale potem bardzo przydatne.

Wynikiem łączenia jest zawsze ciąg znaków, ale łączony obiekt może być wielu typów (generatory, lista, krotki itp.).

.joinjest szybszy, ponieważ przydziela pamięć tylko raz. Lepsza niż klasyczna konkatenacja (patrz, wyjaśnienie rozszerzone ).

Gdy się go nauczysz, jest to bardzo wygodne i możesz wykonywać takie sztuczki, aby dodawać nawiasy.

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

>>> list = ["(",")"]
>>> ",".join("12345").join(list)
Out:
'(1,2,3,4,5)'
Wallebot
źródło
12

Chociaż odpowiedź @Burhan Khalid jest dobra, myślę, że jest bardziej zrozumiała:

from str import join

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

join(sentence, "-") 

Drugi argument funkcji join () jest opcjonalny i domyślnie ustawiony jest na „”.

EDYCJA: Ta funkcja została usunięta w Pythonie 3

SilentVoid
źródło
14
Ta funkcja jest przestarzała w wersji 2.x i zostanie usunięta w wersji 3.x. W takim przypadku nie zaleciłbym używania tego w porównaniu z inną podaną odpowiedzią.
Matthew Green
@Mathew Green ta odpowiedź i odpowiedź Burhana Khalida używają tej samej funkcji na różne sposoby, więc jego odpowiedź również jest nieaktualna. Ale dzięki za zwrócenie na to uwagi, wymyślmy, jak dołączyć do 3.x. Ale jeśli używasz 2.x, to nie zniknie.
SilentVoid,
1
Jego nie jest jednak przestarzałe. W Twojej rekomendacji użyto funkcji z pliku Lib / string.py, która jest zupełnie inna i przestarzała, podczas gdy odpowiedź @ BurhanKhalid używa wbudowanej metody ciągu, która nie jest przestarzała. Jego odpowiedź jest teraz najbardziej poprawna i idzie naprzód, podczas gdy na razie jest dobra tylko na 2.x.
Matthew Green,
Wszystko po to, aby powiedzieć, że jeśli chcesz promować tę alternatywę, powinieneś również zawrzeć ostrzeżenie, że nie jest to zalecane z powodów przedstawionych w moich poprzednich komentarzach.
Matthew Green,
2

Możemy określić, w jaki sposób mamy dołączyć ciąg. Zamiast „-” możemy użyć „”

sentence = ['this','is','a','sentence']
s=(" ".join(sentence))
print(s)
Abhishek V.
źródło
2

Możemy również użyć funkcji redukcji Pythona :

from functools import reduce

sentence = ['this','is','a','sentence']
out_str = str(reduce(lambda x,y: x+"-"+y, sentence))
print(out_str)
Nishkarsh Dixit
źródło
4
Zbyt niepotrzebna złożoność, dlaczego po prostu jej nie użyć join?
Sebastian Palma
-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
źródło
2
Ten fragment kodu może być rozwiązaniem, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu.
alan.elkin