¿Cómo convertir una cadena con elementos delimitados por comas a una lista en Python?

140

¿Cómo se convierte una cadena en una lista?

Digamos que la cuerda es como text = "a,b,c". Después de la conversión, text == ['a', 'b', 'c']y es de esperar text[0] == 'a', text[1] == 'b'?

Clinteney Hui
fuente
2
hola hice esto así, list (stringObject.split (','))
Günay Gültekin

Respuestas:

205

Me gusta esto:

>>> text = 'a,b,c'
>>> text = text.split(',')
>>> text
[ 'a', 'b', 'c' ]

Alternativamente, puede usar eval()si confía en que la cadena es segura:

>>> text = 'a,b,c'
>>> text = eval('[' + text + ']')
Cameron
fuente
@Clinteney: No hay problema ;-) También es posible que desee investigar picklesi persiste los objetos en cadenas.
Cameron
2
Esto no es una matriz, es una lista, las matrices representan valores básicos y se comportan de manera muy similar a las listas, excepto que el tipo de objetos almacenados en ellas está restringido.
joaquin
8
Recordatorio amigable: no use eval, incluso si confía en que la cadena sea segura. No vale la pena el riesgo de seguridad potencial para nada más que scripts personales y violín en un shell interactivo.
A. Wilson
3
eval ('[' + text + ']') tratará a, b, c como variables, no como cadenas.
Phaibin
1
Voto negativo porque las dos soluciones propuestas hacen cosas completamente diferentes, y esto no se explica de ninguna manera en el texto de respuesta. Si bien la pregunta en sí no es realmente clara, debe quedar claro en la respuesta que las dos soluciones no son alternativas equivalentes, sino interpretaciones diferentes de la pregunta.
Matteo Italia
179

Solo para agregar a las respuestas existentes: con suerte, encontrará algo más como esto en el futuro:

>>> word = 'abc'
>>> L = list(word)
>>> L
['a', 'b', 'c']
>>> ''.join(L)
'abc'

Pero con lo que estás lidiando ahora , ve con la respuesta de @ Cameron .

>>> word = 'a,b,c'
>>> L = word.split(',')
>>> L
['a', 'b', 'c']
>>> ','.join(L)
'a,b,c'
Droogans
fuente
44
Aunque estoy de acuerdo con usted en que la respuesta de @ Cameron fue la respuesta "en este momento", creo que su minuciosidad hace que esta sea la respuesta más correcta. Raramente se nos dan cadenas separadas por comas en el mundo real y es bueno saber cómo convertir a una lista independientemente del formato.
TristanZimmerman
39

El siguiente código de Python convertirá su cadena en una lista de cadenas:

import ast
teststr = "['aaa','bbb','ccc']"
testarray = ast.literal_eval(teststr)
Bryan
fuente
3
También pueden usar, jsonpor ejemplo:json.loads(teststr)
Mohammad Nazari
24

Yo no creo que se necesita para

En python, rara vez necesita convertir una cadena en una lista, porque las cadenas y las listas son muy similares.

Cambiando el tipo

Si realmente tiene una cadena que debería ser una matriz de caracteres, haga esto:

In [1]: x = "foobar"
In [2]: list(x)
Out[2]: ['f', 'o', 'o', 'b', 'a', 'r']

No cambiar el tipo

Tenga en cuenta que las cadenas son muy parecidas a las listas en Python

Las cadenas tienen accesores, como listas

In [3]: x[0]
Out[3]: 'f'

Las cadenas son iterables, como listas

In [4]: for i in range(len(x)):
...:     print x[i]
...:     
f
o
o
b
a
r

TLDR

Las cadenas son listas. Casi.

firelynx
fuente
8

En caso de que desee dividir por espacios, puede usar .split():

a = 'mary had a little lamb'
z = a.split()
print z

Salida:

['mary', 'had', 'a', 'little', 'lamb'] 
vivek mishra
fuente
Esto genera lo que hay entre (), es decir, nada en absoluto.
Anthon
7

Si realmente quieres matrices:

>>> from array import array
>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> myarray = array('c', text)
>>> myarray
array('c', 'abc')
>>> myarray[0]
'a'
>>> myarray[1]
'b'

Si no necesita matrices, y solo desea mirar por índice a sus caracteres, recuerde que una cadena es iterable, al igual que una lista, excepto el hecho de que es inmutable:

>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> text[0]
'a'
joaquin
fuente
1
Por curiosidad, después de hacer myarray = array ('c', texto), ¿a dónde se fue la "c"? ya que si escribe array, obtendrá array ("c", "abc"), pero a [0] == a? Gracias
Clinteney Hui
@Clinteney: La 'c' significa "crear una matriz de caracteres". Consulte los documentos para obtener más información
Cameron,
He votado a favor, pero demasiado temprano. Obtengo array ('c', '1 1 91 0.001 228') cuando llamo a = array ('c', e) donde e = "1 1 91 0.001 228"
Valentin Heinitz
@ValentinHeinitz Sí, eso es lo que debe obtener como se muestra en mi ejemplo. Qué esperas ?
joaquin
1
@joaquin: Ok, lo tengo. Está bien con la respuesta. Estaba confundido por la pregunta "text == [a, b, c]" debería ser "text == ['a', 'b', 'c']"
Valentin Heinitz
4
m = '[[1,2,3],[4,5,6],[7,8,9]]'

m= eval(m.split()[0])

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Josué
fuente
Proporcione información adicional junto con su código para que el póster original pueda comprender mejor cómo esto resuelve su problema.
Ivan
4

Todas las respuestas son buenas, hay otra forma de hacerlo, que es la comprensión de la lista, vea la solución a continuación.

u = "UUUDDD"

lst = [x for x in u]

para la lista separada por comas, haga lo siguiente

u = "U,U,U,D,D,D"

lst = [x for x in u.split(',')]
Zeus
fuente
No entiendo una sola línea para bucles y nunca lo
entenderé
1
@MrPizzaGuy es fácil y muy útil cuando lo usas,
mira
1

Usualmente uso:

l = [ word.strip() for word in text.split(',') ]

el stripeliminar espacios alrededor de las palabras.

Yannick Loiseau
fuente
1

Para convertir un archivo que stringtiene el formulario a="[[1, 3], [2, -6]]"que escribí pero aún no está optimizado:

matrixAr = []
mystring = "[[1, 3], [2, -4], [19, -15]]"
b=mystring.replace("[[","").replace("]]","") # to remove head [[ and tail ]]
for line in b.split('], ['):
    row =list(map(int,line.split(','))) #map = to convert the number from string (some has also space ) to integer
    matrixAr.append(row)
print matrixAr
Khalid
fuente
0
# to strip `,` and `.` from a string ->

>>> 'a,b,c.'.translate(None, ',.')
'abc'

Debe usar el translatemétodo incorporado para las cadenas.

Escriba help('abc'.translate)en Python shell para más información.

N 1.1
fuente
0

Usando Python funcional:

text=filter(lambda x:x!=',',map(str,text))
Eratóstenes
fuente