Como converter uma string com itens delimitados por vírgula para uma lista em Python?

140

Como você converte uma string em uma lista?

Diga que a string é como text = "a,b,c". Após a conversão, text == ['a', 'b', 'c']e espero que text[0] == 'a', text[1] == 'b'?

Clinteney Hui
fonte
2
oi eu fiz isso assim, list (stringObject.split (','))
#

Respostas:

205

Como isso:

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

Como alternativa, você pode usar eval()se confiar que a cadeia de caracteres é segura:

>>> text = 'a,b,c'
>>> text = eval('[' + text + ']')
Cameron
fonte
@Clinteney: Não há problema ;-) Você também pode querer examinar picklese você persiste objetos em strings.
22411 Cameron
2
Isso não é uma matriz, é uma lista, as matrizes representam valores básicos e se comportam de maneira semelhante às listas, exceto que o tipo de objetos armazenados nelas é restrito.
Joaquin
8
Lembrete amigável: não use eval, mesmo se você confiar que a string é segura. Não vale o risco potencial de segurança para nada além de scripts pessoais e mexer em um shell interativo.
A. Wilson
3
eval ('[' + text + ']') tratará a, b, c como variáveis, não como string.
Phaibin
1
Voto negativo, porque as duas soluções propostas fazem coisas completamente diferentes, e isso não é explicado de forma alguma no texto da resposta. Embora a pergunta em si não seja realmente clara, deve-se esclarecer na resposta que as duas soluções não são alternativas equivalentes, mas interpretações diferentes da pergunta.
Matteo Italia
179

Apenas para adicionar às respostas existentes: espero que você encontre algo mais parecido com isso no futuro:

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

Mas com o que você está lidando agora , siga a resposta de @ Cameron .

>>> word = 'a,b,c'
>>> L = word.split(',')
>>> L
['a', 'b', 'c']
>>> ','.join(L)
'a,b,c'
Droogans
fonte
4
Embora eu concorde com você que a resposta de @ Cameron foi a resposta "agora", acho que sua minúcia faz com que essa seja a resposta mais correta. Raramente, recebemos sequências separadas por vírgula no mundo real e é bom saber como converter em uma lista, independentemente do formato.
TristanZimmerman 19/05
39

O seguinte código Python transformará sua string em uma lista de strings:

import ast
teststr = "['aaa','bbb','ccc']"
testarray = ast.literal_eval(teststr)
Bryan
fonte
3
Eles também podem usar, jsonpor exemplo:json.loads(teststr)
Mohammad Nazari
24

Eu não acho que você precisa para

No python, você raramente precisa converter uma string em uma lista, porque strings e listas são muito semelhantes

Alterando o tipo

Se você realmente possui uma string que deve ser uma matriz de caracteres, faça o seguinte:

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

Não alterando o tipo

Observe que Strings são muito parecidas com listas em python

Strings têm acessadores, como listas

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

Strings são iteráveis, como listas

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

TLDR

Strings são listas. Quase.

firelynx
fonte
8

Caso deseje dividir por espaços, basta usar .split():

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

Resultado:

['mary', 'had', 'a', 'little', 'lamb'] 
vivek mishra
fonte
Isso gera o que está entre o (), ou seja, nada.
Anthon
7

Se você realmente deseja matrizes:

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

Se você não precisa de matrizes e deseja apenas procurar por índice seus caracteres, lembre-se de que uma string é iterável, como uma lista, exceto pelo fato de ser imutável:

>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> text[0]
'a'
joaquin
fonte
1
Por curiosidade, depois de fazer myarray = array ('c', texto), para onde foi o "c"? desde que, se você digitar array, obteve array ("c", "abc"), mas um [0] == a? Obrigado
Clinteney Hui 22/03
@Clinteney: O 'c' significa "criar uma matriz de caracteres". Veja os documentos para obter mais informações
Cameron
Voto a favor, mas muito cedo. Eu obtenho uma matriz ('c', '1 1 91 0,001 228') ao chamar a = matriz ('c', e) em que e = "1 1 91 0,001 228"
Valentin Heinitz
@ValentinHeinitz Sim, é isso que você deve obter, como mostrado no meu exemplo. O que você espera?
Joaquin
1
@joaquin: Ok, entendi. Está tudo bem com a resposta. Fiquei confuso com a pergunta "text == [a, b, c]" deveria 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é
fonte
Forneça algumas informações adicionais junto com seu código para que o pôster original possa entender melhor como isso resolve o problema dele.
Ivan
4

Todas as respostas são boas, há outra maneira de fazer, que é a compreensão da lista, veja a solução abaixo.

u = "UUUDDD"

lst = [x for x in u]

para lista separada por vírgula, faça o seguinte

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

lst = [x for x in u.split(',')]
Zeus
fonte
Eu não entendo linha única para loops e nunca será
Sr. PizzaGuy
1
@MrPizzaGuy é fácil e muito prático quando você o usa, verifique este youtube.com/watch?v=AhSvKGTh28Q
waghydjemy
1

Eu costumo usar:

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

os stripespaços removem cerca de palavras.

Yannick Loiseau
fonte
1

Para converter um que stringpossua o formulário a="[[1, 3], [2, -6]]", escrevi um código ainda não otimizado:

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
fonte
0
# to strip `,` and `.` from a string ->

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

Você deve usar o built-in translate método interno para seqüências de caracteres.

Digite help('abc'.translate)no shell Python para obter mais informações.

N 1.1
fonte
0

Usando Python funcional:

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