646 votes

Comment créer une chaîne séparée par des virgules à partir d'une liste de chaînes ?

Quelle serait votre méthode préférée pour concaténer des chaînes de caractères à partir d'une séquence de telle sorte qu'une virgule soit ajoutée entre chaque paire consécutive. En d'autres termes, comment mettre en correspondance, par exemple, ['a', 'b', 'c'] a 'a,b,c' ? (Les cas ['s'] y [] doit être mappée à 's' y '' respectivement).

Je finis généralement par utiliser quelque chose comme ''.join(map(lambda x: x+',',l))[:-1] mais aussi un sentiment d'insatisfaction.

0 votes

1218voto

Mark Biek Points 41769
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)

'a,b,c,d'

Cela ne fonctionnera pas si la liste contient des entiers


Et si la liste contient des types autres que des chaînes (tels que des entiers, des flottants, des bools, None), alors do :

my_string = ','.join(map(str, my_list))

0 votes

Notez que si vous utilisez python 2.7 (ce qui ne devrait plus être le cas), l'utilisation de str soulèvera une exception si l'un des éléments de la liste est unicode.

0 votes

Mon besoin, qui m'amène ici, était de remplir une clause SQL "WHERE x NOT IN ()". La fonction join() insère n'importe quelle chaîne de caractères entre les éléments, mais ne fait rien pour chaque fin de liste. Voici donc ce qui fonctionne : nameString = '"{}"'.format('", "'.join(nameList)) Il s'agit de guillemets simples entourant les chaînes de caractères doubles souhaitées. Python 3.7

0 votes

Pourquoi python ne dispose-t-il pas d'une fonction professionnelle pour effectuer cette opération ?

88voto

jmanning2k Points 3354

Pourquoi la map / lambda la magie ? Ça ne marche pas ?

>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))

>>> print(','.join(['a']))
a

Si la liste contient des chiffres, vous pouvez utiliser la compréhension de liste :

>>> ','.join([str(x) for x in foo])

ou une expression de générateur :

>>> ','.join(str(x) for x in foo)

15voto

Aaron Maenpaa Points 39173

Peter Hoffmann

L'utilisation d'expressions de générateur présente l'avantage de produire également un itérateur, mais évite d'importer itertools. De plus, les compréhensions de liste sont généralement préférées à map, et je m'attends donc à ce que les expressions de générateur soient préférées à imap.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar'

0 votes

Les experts, s'il vous plaît, disent pourquoi cette solution n'est pas votée comme la meilleure ? Elle fonctionne avec les entiers, les chaînes de caractères (y compris les "caractères bizarres") et il n'y a qu'une ligne de code. Je suis débutant, j'aimerais donc connaître les limites de cette méthode.

13voto

Douglas Leeder Points 29986

N'avez-vous pas envie de.. :

",".join(l)

Évidemment, cela se complique si vous devez mettre des guillemets, des virgules, etc. entre guillemets dans les valeurs. Dans ce cas, je vous suggère d'utiliser le module csv de la bibliothèque standard :

https://docs.python.org/library/csv.html

6voto

Peter Hoffmann Points 13823

@jmanning2k l'utilisation d'une compréhension de liste a l'inconvénient de créer une nouvelle liste temporaire. La meilleure solution serait d'utiliser itertools.imap qui renvoie un itérateur

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

0 votes

Cette solution ne répond pas aux exigences de ne pas ajouter de virgule supplémentaire pour les chaînes vides et d'ajouter un "None" avec NoneType.

0 votes

vérifier str.join travailler plus rapidement avec list par rapport au générateur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X