3.7. Unir listas y dividir cadenas

Tenemos una lista de pares clave-valor de forma clave=valor, y queremos juntarlos en una sola cadena. Para juntar una lista de cadenas en una sola, usaremos el método join de un objeto de cadena.

Aquí tiene un ejemplo de unión de una lista sacado de la función buildConnectionString:

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

Una nota interesante antes de continuar. He repetido que las funciones son objetos, las cadenas son objetos... todo es un objeto. Podría estar pensando que quiero decir que las variables de cadena son objetos. Pero no, mire atentamente a este ejemplo y verá que la cadena ";" en sí es un objeto, y estamos llamando a su método join.

El método join une los elementos de la lista en una única cadena, separado cada uno por un punto y coma. El delimitador no tiene por qué ser un punto y coma; no tiene siquiera por qué ser un único carácter. Puede ser cualquier cadena.

atención
join funciona sólo sobre listas de cadenas; no hace ningún tipo de conversión de tipos. Juntar una lista que tenga uno o más elementos que no sean cadenas provocará una excepción.

Ejemplo 3.27. La 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 la devuelve la función odbchelper y el bloque que hace la llamada la imprime, lo que nos da la salida de la que se maravilló cuando empezó a leer este capítulo.

Probablemente se pregunta si hay un método análogo para dividir una cadena en una lista de trozos suyos. Y por supuesto la hay y se llama split.

Ejemplo 3.28. Dividir 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 deshace el trabajo de join dividiendo una cadena en una lista de varios elementos. Advierta que el delimitador (“;”) queda completamente eliminado; no aparece en ninguno de los elementos de la cadena devuelta.
2 split toma un segundo argumento opcional, que es el número de veces a dividir. (“"Oooooh, argumentos opcionales...” Aprenderá cómo hacer esto en sus propias funciones en el siguiente capítulo.)
sugerencia
unacadena.split(delimitador, 1) es una forma útil de buscar una subcadena dentro de una cadena, y trabajar después con todo lo que hay antes de esa subcadena (que es el primer elemento de la lista devuelta) y todo lo que hay detrás (el segundo elemento).

Lecturas complementarias sobre métodos de cadenas

3.7.1. Nota histórica sobre los métodos de cadena

Cuando aprendí Python, esperaba que join fuese un método de una lista, que tomaría delimitadores como argumento. Mucha gente piensa lo mismo, pero hay toda una historia tras el método join. Antes de Python 1.6, las cadenas no tenían todos estos métodos tan útiles. Había un módulo string aparte que contenía todas las funciones de cadenas; cada función tomaba una cadena como primer argumento. Se consideró que estas funciones eran suficientemente importantes como para ponerlas en las propias cadenas, lo cual tenía sentido en funciones como lower, upper, y split. Pero muchos programadores del ala dura de Python objetaron ante el nuevo método join, argumentando que debería ser un método de las listas, o que no debería moverse de lugar siquiera, sino seguir siendo parte exclusiva del módulo string (que aún sigue conteniendo muchas cosas útiles). Yo uso el nuevo método join de forma exclusiva, pero verá mucho código escrito de la otra manera, y si realmente le molesta, puede limitarse a usar la antigua función string.join en su lugar.