¿Cómo crearías una cadena separada por comas a partir de una lista de cadenas?

StackOverflow https://stackoverflow.com/questions/44778

  •  09-06-2019
  •  | 
  •  

Pregunta

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

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

Editar:Estoy avergonzado y feliz al mismo tiempo de que la solución sea tan simple.Obviamente no tengo ni idea de lo que estoy haciendo.(Probablemente necesité una concatenación "simple" en el pasado y de alguna manera memoricé s.join([e1,e2,...]) como abreviatura de s+e1+e2+....)

¿Fue útil?

Solución

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

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


Como ricardo reyes sugerido, si contiene tipos que no son cadenas (como enteros, flotantes, bools, Ninguno), haga lo siguiente:

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

Otros consejos

¿Por qué la magia del mapa/lambda?¿No funciona esto?

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

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

Editar:@mark-biek destaca el caso de los números.Quizás la lista de comprensión:

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

es más "pitónico".

Editar2: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á para 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 que no son cadenas:

>>> alist = ['a', 1, (2, 'b')]
  • una manera 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 Hoffman

El uso de expresiones generadoras tiene la ventaja de producir también un iterador, pero ahorra la importación de itertools.Además, generalmente se prefieren las listas por comprensión para mapear, por lo que esperaría que se prefirieran las expresiones generadoras a imap.

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

¿No quieres simplemente:

",".join(l)

Obviamente, se vuelve más complicado si necesita comillas/comas de escape, 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 usar una lista por 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))

para convertir una 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ías hacer lo que estás pidiendo.

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

(editar:y como señala jmanning2k,

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

es más seguro y bastante pitónico, aunque la cadena resultante será difícil de analizar si los elementos pueden contener comas; en ese punto, necesita toda la potencia del csv módulo, como señala Douglas 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 el csv La biblioteca es la única opción sensata aquí, ya que fue creada para hacer frente a todos los casos de uso de CSV, como comas en una cadena, etc.

Para generar una lista l a 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 en csv.

Este ejemplo es compatible con Python 3, como se usa en la otra respuesta aquí StringIO que es Python 2.

algo como esto :)

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

ring = (" , ").join(ding)

print(ring)

Producción:Érase, sobre, un, tiempo, un, largo, tiempo, hace

Mis dos centavos.Me gusta un código más simple 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 pitónico, funciona para cadenas, números, Ninguno y cadenas vacías.Es breve 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 señaló @Peter Hoffmann (gracias).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top