1.14. Unión y división de cadenas

Usted tiene una lista de pares clave-valor en la forma clave=valor, y quiere unirlos en una única cadena. Para unir cualquier lista de cadenas en una única cadena, utilice el método join de un objeto cadena.

Ejemplo 1.34. Unión de una lista en buildConnectionString

    return ";".join(["%s=%s" % (k, v) for k, v in params.items()])

Una advertencia interesante antes de continuar. He repetido que las funciones son objetos, las cadenas son objetos, todo es un objeto. Podría usted pensar que quiero decir que las variables de cadena son objetos. Pero no, observe atentamente este ejemplo y verá que la cadena ";" es un objeto, y que se está llamando a su método join.

En todo caso, el método join une los elementos de la lista para formar una única cadena, con cada elemento separado por un punto y coma. El delimitador no tiene que ser un punto y coma; no tiene que ser siquiere un único carácter. Puede ser cualquier cadena.

Importante
join sólo funciona con listas de cadenas; no hace ninguna conversión de tipos. Si se une una lista que tiene uno o más elementos que no sean cadenas, se lanzará una excepción.

Ejemplo 1.35. Salida de odbchelper.py

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> ["%s=%s" % (k, v) for k, v in params.items()]
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> ";".join(["%s=%s" % (k, v) for k, v in params.items()])
server=mpilgrim;uid=sa;database=master;pwd=secret

Esta cadena es devuelta por la función help e impresa por el bloque que la llamó, lo que da la salida que le sorprendió cuando empezó usted a leer este capítulo.

Nota histórica. Cuando empecé a aprender Python, esperaba que join fuera un método de lista, que tomara el delimitador como argumento. Mucha gente piensa lo mismo, y hay toda una historia detrás del método join. Antes de la versión 1.6 de Python, las cadenas no tenían todos estos útiles métodos. Había un módulo separado, string, que contenía todas las funciones de cadena; cada función tomaba una cadena como primer argumento. Las funciones se consideraron lo suficientemente importantes como para añadirlas a las propias cadenas, lo cual tiene sentido en funciones como lower, upper y split. Pero muchos programadores de Python pusieron objeciones al nuevo método join, argumentando que debería ser un método de lista y no de cadena, o incluso que debería seguir siendo parte del antiguo módulo string (que aún conserva material útil). Yo utilizo sólo el nuevo método join, pero puede verse código escrito en ambas formas, y si esto le resulta realmente molesto, puede usted utilizar la función string.join en su lugar.

Probablemente se preguntará usted si existe un método complementario para dividir una cadena en una lista. Por supuesto que existe, se llama split.

Ejemplo 1.36. División de una cadena

>>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s = ";".join(li)
>>> s
'server=mpilgrim;uid=sa;database=master;pwd=secret'
>>> s.split(";")    1
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s.split(";", 1) 2
['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
1 split realiza la operación inversa a join, dividiendo una cadena en una lista con varios elementos. Observe que el delimitador (“;”) se elimina completamente; no aparece en ninguno de los elementos de la lista devuelta.
2 split toma un segundo argumento opcional, que es el número de veces que se raliza la división. (“Oooooh, argumentos opcionales...” Aprenderá cómo hacer esto en sus propias funciones en el próximo capítulo.)
Nota
cadena.split(delimitador, 1) es una técnica útil cuando se quiere buscar una subcadena en una cadena y después trabajar con lo que la precede (que queda en el primer elemento de la lista devuelta) y lo que la sigue (que queda en el segundo elemento).

Lecturas complementarias