Réponses:
Utilisez la join
méthode de la chaîne vide pour joindre toutes les chaînes avec la chaîne vide entre les deux, comme ceci:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
un espace entre les guillemets
"".join(['a','b','c'])
signifie Join all elements of the array, separated by the string ""
. De la même manière, " hi ".join(["jim", "bob", "joe"])
va créer "jim hi bob hi joe"
.
Cela fonctionne dans de nombreux langages populaires comme JavaScript et 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'
Assez étrange, en Python, la join
méthode est sur la str
classe:
# this is the Python way
"".join(['a','b','c','d'])
Pourquoi join
n'y a- t -il pas une méthode dans l' list
objet comme en JavaScript ou dans d'autres langages de script populaires? 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, pas dans la classe de liste, donc la str.join(list)
méthode signifie: joindre la liste dans une nouvelle chaîne en utilisant str
comme séparateur (dans ce cas, str
c'est une chaîne vide).
D'une certaine manière, j'ai appris à 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.
string.join()
avec la plupart des collections ayant une join()
méthode dans de nombreux langages dynamiques. Concernant les itérables, je suppose que ce n'est pas un problème pour de telles langues car il est aussi facile (et lisible) d'inclure l'itérable dans un constructeur de collection et une chaîne dans la join()
méthode.
Si votre interpréteur Python est ancien (1.5.2, par exemple, ce qui est courant sur certaines anciennes distributions Linux), il se peut que vous ne disposiez pas join()
de méthode comme méthode sur un ancien objet chaîne, et vous devrez plutôt 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'
''.join(['a','b','c'])
map(ord,a)
n'est pas nécessaire, mais joint les besoins map(chr,a)
. Voici mon benchmark pastebin.com/1sKFm8ma
''.join()
est beaucoup plus lisible.
La fonction de réduction fonctionne également
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
ou (apply + h)
fonctionnerait. Mais là encore, en Python, l'opérateur add prend exactement 2 opérandes, d'où la nécessité de réduire. Sinon, vous pourriez le faire operator.add(*h)
, car apply
a été officiellement déconseillé en Python au profit de la syntaxe d'appel étendue (aka en.wikipedia.org/wiki/Variadic_function )
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
''.join([str(i) for i in arr])
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)
dépasserait de loin votre méthode d'ajout un par un.
en plus str.join
qui est le moyen le plus naturel, une possibilité est d'utiliser io.StringIO
et d'abuser writelines
pour écrire tous les éléments en une seule 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 de générateur ou un itérable qui n'est pas un tuple
ou un list
, il enregistre la création de liste temporaire qui join
alloue la bonne taille en une seule fois (et une liste de chaînes à 1 caractère coûte très cher en mémoire ).
Si vous manquez de mémoire et que vous avez en entrée un objet évalué paresseusement, cette approche est la meilleure solution.
Vous pouvez également 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
depuis que la fonction intégrée reduce()
a été supprimée de Python 3 et vit maintenant dans functools.reduce()
.