2008-09-04 40 views
288

¿Cuál sería tu forma preferida de concatenar cadenas de una secuencia de manera que entre cada dos pares consecutivos se agregue una coma? Es decir, ¿cómo mapea, por ejemplo, [ 'a', 'b', 'c' ] a 'a,b,c'? (Los casos [ s ] y [] se deben asignar a s y '', respectivamente.)¿Cómo harías una cadena separada por comas de una lista?

Por lo general terminan usando algo como ''.join(map(lambda x: x+',',l))[:-1], sino también sentir algo insatisfecho.

Editar: Estoy tan avergonzado y feliz de que la solución es tan simple. Obviamente, apenas tengo idea de lo que estoy haciendo. (Probablemente necesitaba concatenación "simple" en el pasado y de alguna manera memorizado s.join([e1,e2,...]) como una forma abreviada de s+e1+e2+....)

Respuesta

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

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


Como Ricardo Reyes sugirió, si contiene tipos que no son cadenas (tales como números enteros, flotadores, Bools, ninguno) a continuación, hacer:

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

tiene razón, no funcionará si la lista contiene números, pero de esta manera lo hará: myList = ','. Join (map (str, myList)) –

+0

¡Ah! Usaré map() en el futuro. Siempre he hecho: myString = ",". Join ([str (x) para x en myList]) –

+6

'myString =", ". Join (myList)' incluso si la lista contiene números. Solo lo probé. – zengr

55

Por qué la magia mapa/lambda? ¿Esto no funciona?

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

>>>print ",".join(['a']) 
a 

Editar: @ mark-biek señala el caso de los números. Tal vez la lista por comprensión:

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

es más "Pythonic".

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

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

'>>> ','. Join (str (x) para x en foo)' ¡es genial! – Marslo

+3

¿Qué pasa si quiero 'a, b y c'? – Hussain

+0

@Hussain: '", ".join (foo [: - 2] + [" y ".join (foo [-2:])])' o si puede obtener números: '", ".join (itertools .chain ((str (i) para i en a [: - 2]), ["y" .join (str (i) para i en a [-2:])])) ' –

10

no hacer lo que desea:

",".join(l) 

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

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

1

A menos que me falta algo, ','.join(foo) debe hacer lo que usted está 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.)

4

@ jmanning2k utilizando una lista de comprensión tiene la desventaja 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)) 
+0

Esta solución no Cumplir con los requisitos de no agregar una coma adicional para cadena vacía y agregar un 'Ninguno' con NoneType. – Roberto

8

@Peter Hoffmann

Uso de expresiones generador tiene la ventaja de producir también un iterador, pero ahorra itertools importadores. Además, las listas de comprensión son generalmente preferidas para mapear, por lo tanto, esperaría que las expresiones de generador fueran preferibles a imap.

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

print str(l)[1:-1] 

Output: "'a', 1, 'b', 2" 
+0

Creo que debe señalar que a diferencia de las otras soluciones en esta página, también cita cadenas. – mrdevlar

8

Aquí es una solución alternativa en Python 3.0, que permite que la lista no son cadenas artículos:

>>> 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.

3

de lista que contiene los números de conversión de hacer lo siguiente:

string = ''.join([str(i) for i in list]) 
7

",".join(l) no funcionará para todos los casos. Yo sugeriría utilizando 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' 
0

Aquí se muestra un ejemplo con la lista

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

más precisa: -

>>> 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 
+0

Esta pregunta fue sobre listas, no * listas de listas *. –

+0

@EeroAaltonen Actualicé mi respuesta, gracias por señalarme a la derecha. –

2
>>> 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'.

-1

Mis dos centavos. Me gusta más simple de un código de una línea 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, que funciona para las cadenas, números, y ninguno cadena vacía. Es corto y cumple 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)) 

También esta solución no crea una nueva lista, pero utiliza un iterador, como señaló @Peter Hoffmann (gracias).

+0

Esto es superfluo. La respuesta aceptada es simple, directa y claramente la mejor solución. Proporcionar alternativas demasiado complejas es una pérdida de tiempo inútil. Si simplemente está tratando de educar sobre otras características del lenguaje cuando ya hay respuestas viables, está haciendo lo mismo por lo que me votó negativamente. – clearlight

Cuestiones relacionadas