¿Cómo harías una cadena separada por comas de una lista de cadenas?

¿Cuál sería su forma preferida de concatenar cadenas de una secuencia tal que se agregue una coma entre cada dos pares consecutivos? Es decir, ¿cómo asigna, por ejemplo, [ 'a', 'b', 'c' ] a 'a,b,c' ? (Los casos [ s ] y [] deben asignarse a s y '' , respectivamente.)

Normalmente termino usando algo como ''.join(map(lambda x: x+',',l))[:-1] , pero también me siento algo insatisfecho.

Edit: Estoy avergonzado y feliz de que la solución sea tan simple. Obviamente no tengo ni idea de lo que estoy haciendo. (Probablemente necesitaba una concatenación “simple” en el pasado y, de alguna manera, la s.join([e1,e2,...]) como una abreviatura de s+e1+e2+... )

 myList = ['a','b','c','d'] myString = ",".join(myList ) 

Esto no funcionará si la lista contiene números.


Como sugirió Ricardo Reyes , si contiene tipos que no son de cadena (como enteros, flotantes, bools, Ninguno), entonces haga:

 myList = ','.join(map(str, myList)) 

¿Por qué el mapa / lambda mágica? ¿No funciona esto?

 >>>foo = [ 'a', 'b', 'c' ] >>>print ",".join(foo) a,b,c >>>print ",".join([]) >>>print ",".join(['a']) a 

Edición: @ mark-biek señala el caso de los números. Quizás la lista de comprensión:

 >>>','.join([str(x) for x in foo]) 

Es más “pythonico”.

Edit2: Gracias por las sugerencias. Usaré el generador en lugar de la lista de comprensión en el futuro.

 >>>','.join(str(x) for x in foo) 

",".join(l) no funcionará en todos los casos. Sugeriría usar el módulo csv con StringIO

 import StringIO import csv l = ['list','of','["""crazy"quotes"and\'',123,'other things'] line = StringIO.StringIO() writer = csv.writer(line) writer.writerow(l) csvcontent = line.getvalue() # 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n' 

Aquí hay una solución alternativa en Python 3.0 que permite elementos de lista sin cadena:

 >>> alist = ['a', 1, (2, 'b')] 
  • una forma estándar

     >>> ", ".join(map(str, alist)) "a, 1, (2, 'b')" 
  • la solución alternativa

     >>> import io >>> s = io.StringIO() >>> print(*alist, file=s, sep=', ', end='') >>> s.getvalue() "a, 1, (2, 'b')" 

NOTA: El espacio después de la coma es intencional.

@Peter Hoffmann

El uso de expresiones generadoras tiene la ventaja de que también produce un iterador pero ahorra la importación de herramientas. Además, las listas de comprensión generalmente se prefieren para mapear, por lo tanto, espero que se prefieran las expresiones generadoras para imap.

 >>> l = [1, "foo", 4 ,"bar"] >>> ",".join(str(bit) for bit in l) '1,foo,4,bar' 

No solo quieres

 ",".join(l) 

Obviamente, se vuelve más complicado si necesita citar / escapar comas, etc. en los valores. En ese caso, sugeriría mirar el módulo csv en la biblioteca estándar:

https://docs.python.org/library/csv.html

 >>> my_list = ['A', '', '', 'D', 'E',] >>> ",".join([str(i) for i in my_list if i]) 'A,D,E' 

my_list puede contener cualquier tipo de variables. Esto evita el resultado 'A,,,D,E' .

@ jmanning2k utilizando una lista de comprensión tiene el inconveniente de crear una nueva lista temporal. La mejor solución sería usar itertools.imap que devuelve un iterador.

 from itertools import imap l = [1, "foo", 4 ,"bar"] ",".join(imap(str, l)) 

Para convertir la lista que contiene números, haga lo siguiente:

 string = ''.join([str(i) for i in list]) 
 l=['a', 1, 'b', 2] print str(l)[1:-1] Output: "'a', 1, 'b', 2" 

A menos que me esté perdiendo algo, ','.join(foo) debería hacer lo que estás pidiendo.

 >>> ','.join(['']) '' >>> ','.join(['s']) 's' >>> ','.join(['a','b','c']) 'a,b,c' 

(Edit: y como señala jmanning2k,

 ','.join([str(x) for x in foo]) 

es más seguro y bastante Pythonic, aunque la cadena resultante será difícil de analizar si los elementos pueden contener comas (en ese momento, necesita toda la potencia del módulo csv , como Douglas señala en su respuesta).

Aquí hay un ejemplo con lista

 >>> myList = [['Apple'],['Orange']] >>> myList = ','.join(map(str, [i[0] for i in myList])) >>> print "Output:", myList Output: Apple,Orange 

Más preciso:-

 >>> myList = [['Apple'],['Orange']] >>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) >>> print "Output:", myList Output: Apple,Orange 

Ejemplo 2: –

 myList = ['Apple','Orange'] myList = ','.join(map(str, myList)) print "Output:", myList Output: Apple,Orange 

Yo diría que la biblioteca csv es la única opción sensata aquí, ya que fue creada para hacer frente a todos los casos de uso de csv, como las comas en una cadena, etc.

Para generar una lista l en un archivo .csv:

 import csv with open('some.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(l) # this will output l as a single row. 

También es posible utilizar writer.writerows(iterable) para generar varias filas a csv.

Este ejemplo es compatible con Python 3, ya que la otra respuesta aquí utiliza StringIO que es Python 2.

Solo algo como esto 🙂

 String = "Once:Upon:a:Time:A:Long:Time:Ago" ding = String.split(':') ring = (" , ").join(ding) print(ring) 

Salida: Once, Upon, a, Time, A, Long, Time, Ago

Mis dos centavos. Me gusta un código de una línea más simple en python:

 >>> from itertools import imap, ifilter >>> l = ['a', '', 'b', 1, None] >>> ','.join(imap(str, ifilter(lambda x: x, l))) a,b,1 >>> m = ['a', '', None] >>> ','.join(imap(str, ifilter(lambda x: x, m))) 'a' 

Es pythonic, funciona para cadenas, números, ninguno y cadena vacía. Es corto y cumple con los requisitos. Si la lista no va a contener números, podemos usar esta variación más simple:

 >>> ','.join(ifilter(lambda x: x, l)) 

Además, esta solución no crea una nueva lista, sino que utiliza un iterador, como @Peter Hoffmann señaló (gracias).