Respuestas:
Use el join
método de la cadena vacía para unir todas las cadenas junto con la cadena vacía en el medio, así:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)
con un espacio entre las comillas
"".join(['a','b','c'])
medios Join all elements of the array, separated by the string ""
. De la misma manera, " hi ".join(["jim", "bob", "joe"])
creará "jim hi bob hi joe"
.
Esto funciona en muchos lenguajes populares como JavaScript y Ruby, ¿por qué no en Python?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Por extraño que parezca, en Python el join
método está en la str
clase:
# this is the Python way
"".join(['a','b','c','d'])
¿Por qué join
no hay un método en el list
objeto como en JavaScript u otros lenguajes de script populares? Es un ejemplo de cómo piensa la comunidad Python. Dado que join está devolviendo una cadena, debe colocarse en la clase de cadena, no en la clase de lista, por lo que el str.join(list)
método significa: unir la lista en una nueva cadena usando str
como separador (en este caso str
es una cadena vacía).
De alguna manera llegué a amar esta forma de pensar después de un tiempo. Me puedo quejar de muchas cosas en el diseño de Python, pero no de su coherencia.
string.join()
con la mayoría de las colecciones que tienen un join()
método en muchos lenguajes dinámicos. Con respecto a los iterables, supongo que no es un problema para tales lenguajes porque es tan fácil (y legible) encerrar el iterable en un constructor de colecciones y una cadena en el join()
método.
Si su intérprete de Python es antiguo (1.5.2, por ejemplo, que es común en algunas distribuciones de Linux más antiguas), es posible que no tenga join()
disponible como método en ningún objeto de cadena antiguo, y en su lugar deberá usar el módulo de cadena. Ejemplo:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
La cadena b
será 'abcd'
.
Esta puede ser la forma más rápida:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
es necesario, pero unir las necesidades map(chr,a)
. Aquí está mi punto de referencia pastebin.com/1sKFm8ma
''.join()
es mucho más legible.
La función de reducción también funciona
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)
o (apply + h)
funcionaría. Pero, de nuevo, en Python, el operador add toma exactamente 2 operandos, de ahí la necesidad de reducir. De lo contrario, podría hacerlo operator.add(*h)
, ya que apply
ha quedado oficialmente en desuso en Python a favor de la sintaxis de llamada extendida (también conocido como en.wikipedia.org/wiki/Variadic_function )
Si la lista contiene números, puede usar map()
con join()
.
P.ej:
>>> 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)
superaría con creces su método de adición uno por uno.
Además de str.join
cuál es la forma más natural, una posibilidad es usar io.StringIO
y abusar writelines
de escribir todos los elementos de una vez:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
huellas dactilares:
abcd
Cuando se usa este enfoque con una función generadora o un iterable que no es un tuple
o un list
, guarda la creación de la lista temporal que join
hace para asignar el tamaño correcto de una vez (y una lista de cadenas de 1 carácter es muy costosa en cuanto a memoria )
Si tiene poca memoria y tiene un objeto vagamente evaluado como entrada, este enfoque es la mejor solución.
También podría usar operator.concat()
así:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Si está utilizando Python 3, debe anteponer:
>>> from functools import reduce
ya que la construcción reduce()
se ha eliminado de Python 3 y ahora vive en ella functools.reduce()
.