web-dev-qa-db-fra.com

Convertir une liste de caractères en une chaîne

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'
368
nos

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'
516
Daniel Stutzbach

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.

33
Paulo Scardine

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'.

15
Kyle

Cela peut être le moyen le plus rapide:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
10
bigeagle

La fonction de réduction fonctionne également

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
5
cce

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)
3
octoback
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'
3
Bill

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
2
yask

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()

0
Tonechas

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.

0