Concaténer l'élément de la liste aux chaînes

576

Existe-t-il un moyen plus simple de concaténer des éléments de chaîne dans une liste en une seule chaîne? Puis-je utiliser la str.join()fonction?

Par exemple, c'est l'entrée ['this','is','a','sentence']et c'est la sortie souhaitéethis-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
la source
24
'-'.join(sentence)
aland

Réponses:

1054

Utilisation join:

>>> sentence = ['this','is','a','sentence']
>>> '-'.join(sentence)
'this-is-a-sentence'
Burhan Khalid
la source
13
Je n'ai pas compris, quel est le «-» à gauche censé être ??
Lawrence DeSouza
5
@LawrenceDeSouza La chaîne que vous souhaitez joindre; voir la documentation , ou cette réponse qui rentre un peu plus dans les détails.
Burhan Khalid
9
Je m'attendais sentence.join(" ")à ce que cela fonctionne aussi, puisque l'opération inverse est list.split(" "). Une idée si cela va être ajouté aux méthodes de Python pour les listes?
Wouter Thielen
10
@Wouter, ce ne sera pas le cas. D'une part, seules les listes de chaînes peuvent être jointes; donc list.joinserait inappropriée pour une liste arbitraire. De l'autre, l'argument de str.joinpeut être n'importe quelle séquence de chaînes "itérable", pas seulement une liste. La seule chose qui aurait du sens est une fonction intégrée join(list, sep); il y en a un dans le stringmodule (fondamentalement obsolète) si vous le voulez vraiment.
alexis
4
@Leo' '.join(['this', 'is', 'a', 'sentence'])
Burhan Khalid
120

Une façon plus générique de convertir des listes python en chaînes serait:

>>> 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'
6pack kid
la source
3
pourquoi la compréhension de la liste est-elle nécessaire lorsque l'entrée est une chaîne? map(str, my_lst)serait également suffisant sans énumérer la liste =)
alvas
5
La plupart des réponses à cette question envisagent le cas où la liste contient des chaînes. Le mien est un moyen générique de convertir des listes en chaînes. Dans mon exemple, la liste est de type intmais il peut s'agir de n'importe quel type pouvant être représenté sous forme de chaîne.
6pack kid
3
Pour ajouter à cela, la carte serait également utile lorsqu'elle est utilisée avec une fonction lambda. Par exemple ' '.join(map(lambda x: ' $'+ str(x), my_lst))reviendrait'$1 $2 $3 $4 $5 $6 $7 $8 $9 $10'
ScottMcC
3
l'ajout d'une carte aide réellement avec les types de données en dehors de la chaîne. Génial!
appleboy
40

Il est très utile pour les débutants de savoir pourquoi join est une méthode de chaîne .

C'est très étrange au début, mais très utile après cela.

Le résultat de la jointure est toujours une chaîne, mais l'objet à joindre peut être de plusieurs types (générateurs, liste, tuples, etc.).

.joinest plus rapide car il n'alloue de la mémoire qu'une seule fois. Mieux que la concaténation classique (voir, explication détaillée ).

Une fois que vous l'avez appris, c'est très confortable et vous pouvez faire des tours comme celui-ci pour ajouter des parenthèses.

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

>>> list = ["(",")"]
>>> ",".join("12345").join(list)
Out:
'(1,2,3,4,5)'
Wallebot
la source
12

Bien que la réponse de @Burhan Khalid soit bonne, je pense que c'est plus compréhensible comme ceci:

from str import join

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

join(sentence, "-") 

Le deuxième argument de join () est facultatif et vaut par défaut "".

EDIT: Cette fonction a été supprimée dans Python 3

SilentVoid
la source
14
Cette fonction est obsolète dans 2.x et va être supprimée dans 3.x. Cela étant le cas, je ne recommanderais pas d'utiliser cela sur l'autre réponse fournie.
Matthew Green
@Mathew Green cette réponse et la réponse de Burhan Khalid utilisent la même fonction de différentes manières, donc sa réponse est également déconseillée. Mais merci d'avoir souligné cela, gota comprendre comment rejoindre en 3.x. Mais si vous utilisez 2.x, cela ne disparaîtra pas.
SilentVoid
1
Le sien n'est pas déprécié cependant. Votre recommandation utilise une fonction de Lib / string.py qui est complètement différente et déconseillée tandis que @BurhanKhalid answer utilise la méthode de chaîne intégrée qui n'est pas déconseillée. Sa réponse est la plus correcte maintenant et va de l'avant alors que ce n'est bon que pour l'instant sur 2.x.
Matthew Green
Tout cela pour dire que si vous souhaitez promouvoir cette alternative, vous devez également inclure un avertissement que cela n'est pas recommandé pour les raisons décrites dans mes commentaires précédents.
Matthew Green
2

Nous pouvons spécifier comment nous devons joindre la chaîne. Au lieu de «-», nous pouvons utiliser «»

sentence = ['this','is','a','sentence']
s=(" ".join(sentence))
print(s)
Abhishek V
la source
2

Nous pouvons également utiliser la fonction de réduction de Python :

from functools import reduce

sentence = ['this','is','a','sentence']
out_str = str(reduce(lambda x,y: x+"-"+y, sentence))
print(out_str)
Nishkarsh Dixit
la source
4
Trop de complexité inutile, pourquoi ne pas simplement utiliser 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
la source
2
Bien que cet extrait de code puisse être la solution, y compris une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondrez à la question des lecteurs à l'avenir et que ces personnes ne connaissent peut-être pas les raisons de votre suggestion de code.
alan.elkin