Si j'ai une liste de caractères:
a = ['a','b','c','d']
Comment puis-je le convertir en une seule chaîne?
a = 'abcd'
Utilisez la méthode join
de la chaîne vide pour joindre toutes les chaînes avec la chaîne vide entre elles, comme suit:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
Cela fonctionne en JavaScript ou en Ruby, pourquoi pas en Python?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Mais en Python, la méthode join
est dans la classe str
:
# this is the Python way
"".join(['a','b','c','d'])
C'est un peu bizarre, n'est-ce pas? Pourquoi join
n'est-il pas une méthode dans l'objet list
comme dans JavaScript ou d'autres langages de script courants? C'est un exemple de la façon dont la communauté Python pense. Puisque join renvoie une chaîne, elle doit être placée dans la classe de chaîne et non dans la classe de liste. La méthode str.join(list)
signifie donc: joindre la liste à une nouvelle chaîne en utilisant str
comme séparateur (dans ce cas, str
est une chaîne vide) .
D'une manière ou d'une autre, j'ai eu la chance d'aimer cette façon de penser après un certain temps. Je peux me plaindre de beaucoup de choses dans la conception Python, mais pas de sa cohérence.
Si votre interpréteur Python est ancien (1.5.2, par exemple, ce qui est courant sur certaines distributions Linux plus anciennes), il est possible que join()
ne soit pas disponible comme méthode sur un ancien objet chaîne et que vous aurez plutôt besoin d'utiliser le module chaîne. Exemple:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
La chaîne b
sera 'abcd'
.
Cela peut être le moyen le plus rapide:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
La fonction de réduction fonctionne également
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
utiliser join
avec un séparateur vide
h = ['a','b','c','d','e','f']
print ''.join(h)
ou utilisez reduce
avec l'opérateur add
import operator
h=['a','b','c','d']
reduce(operator.add, h)
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
Si la liste contient des nombres, vous pouvez utiliser map()
avec join()
.
Par exemple:
arr = [3, 30, 34, 5, 9]
''.join(map(str,arr))
>> 3303459
Vous pouvez aussi utiliser operator.concat()
comme ceci:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Si vous utilisez Python 3, vous devez ajouter:
>>> from functools import reduce
puisque la reduce()
intégrée a été supprimée de Python 3 et réside maintenant dans functools.reduce()
.
en plus de str.join
qui est le moyen le plus naturel, une possibilité consiste à utiliser io.StringIO
et à abuser de writelines
pour écrire tous les éléments en une fois:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
impressions:
abcd
Lorsque vous utilisez cette approche avec une fonction génératrice ou une variable itérative qui n'est pas un Tuple
ou un list
, cela enregistre la création temporaire de la liste que join
attribue à la taille correcte en une fois (et une liste de chaînes de 1 caractère est très coûteuse mémoire-sage).
Si vous avez peu de mémoire et que vous avez un objet évalué paresseusement, cette approche est la meilleure solution.