lista - python separar string por caracter
¿Cómo harías una cadena separada por comas de una lista de cadenas? (15)
¿Cuál sería su forma preferida de concatenar cadenas de una secuencia de manera que entre cada dos pares consecutivos se agregue una coma? 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+...
¿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
Edición: @ mark-biek señala el caso de los números. Tal vez la lista de comprensión:
>>>'',''.join([str(x) for x in foo])
Es más "pitónico".
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)
@ jmanning2k usando una lista de comprensión tiene la desventaja de crear una nueva lista temporal. La mejor solución sería utilizar itertools.imap que devuelve un iterador.
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
@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 son generalmente preferidas para mapear, por lo tanto, yo esperaría que las expresiones generadoras sean preferidas para imap.
>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
''1,foo,4,bar''
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 pitón, aunque la cadena resultante será difícil de analizar si los elementos pueden contener comas (en ese momento, se necesita toda la potencia del módulo csv
, 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
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.
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).
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:
Para convertir la lista que contiene números, haga lo siguiente:
string = ''''.join([str(i) for i in list])
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
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.
",".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''
>>> 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''
.
l=[''a'', 1, ''b'', 2]
print str(l)[1:-1]
Output: "''a'', 1, ''b'', 2"
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))