Comment convertir une chaîne avec des éléments séparés par des virgules en une liste en Python?

140

Comment convertissez-vous une chaîne en liste?

Disons que la chaîne est comme text = "a,b,c". Après la conversion, text == ['a', 'b', 'c']et je l' espère text[0] == 'a', text[1] == 'b'?

Clinteney Hui
la source
2
salut j'ai fait ça comme ça, list (stringObject.split (','))
Günay Gültekin

Réponses:

205

Comme ça:

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

Vous pouvez également utiliser eval()si vous faites confiance à la chaîne pour être sûre:

>>> text = 'a,b,c'
>>> text = eval('[' + text + ']')
Cameron
la source
@Clinteney: Pas de problème ;-) Vous voudrez peut-être aussi vérifier picklesi vous persistez des objets en chaînes.
Cameron
2
Ce n'est pas un tableau, c'est une liste, les tableaux représentent des valeurs de base et se comportent beaucoup comme des listes, sauf que le type d'objets qui y sont stockés est contraint.
joaquin
8
Rappel amical: n'utilisez pas eval, même si vous faites confiance à la chaîne pour être sûre. Cela ne vaut pas le risque de sécurité potentiel pour autre chose que des scripts personnels et du violon dans un shell interactif.
A. Wilson
3
eval ('[' + text + ']') traitera a, b, c comme des variables et non comme une chaîne.
phaibin
1
Évalué parce que les deux solutions proposées font des choses complètement différentes, et cela n'est en aucun cas expliqué dans le texte de la réponse. Bien que la question elle-même ne soit pas vraiment claire, il convient de préciser dans la réponse que les deux solutions ne sont pas des alternatives équivalentes, mais des interprétations différentes de la question.
Matteo Italia
179

Juste pour ajouter aux réponses existantes: j'espère que vous rencontrerez quelque chose de plus comme ça à l'avenir:

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

Mais ce à quoi vous avez affaire en ce moment , allez avec la réponse de @ Cameron .

>>> word = 'a,b,c'
>>> L = word.split(',')
>>> L
['a', 'b', 'c']
>>> ','.join(L)
'a,b,c'
Droogans
la source
4
Bien que je sois d'accord avec vous que la réponse de @ Cameron était la réponse "pour le moment", je pense que votre minutie en fait la réponse la plus correcte. On nous donne rarement des chaînes séparées par des virgules dans le monde réel et il est bon de savoir comment convertir une liste quel que soit le format.
TristanZimmerman
39

Le code Python suivant transformera votre chaîne en une liste de chaînes:

import ast
teststr = "['aaa','bbb','ccc']"
testarray = ast.literal_eval(teststr)
Bryan
la source
3
Ils peuvent également utiliser jsonpar exemple:json.loads(teststr)
Mohammad Nazari
24

Je ne pense pas que tu as besoin de

En python, vous avez rarement besoin de convertir une chaîne en liste, car les chaînes et les listes sont très similaires

Changer le type

Si vous avez vraiment une chaîne qui devrait être un tableau de caractères, procédez comme suit:

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

Ne pas changer le type

Notez que les chaînes ressemblent beaucoup à des listes en python

Les chaînes ont des accesseurs, comme des listes

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

Les chaînes sont itérables, comme les listes

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

TLDR

Les chaînes sont des listes. Presque.

firelynx
la source
8

Si vous souhaitez diviser par espaces, vous pouvez simplement utiliser .split():

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

Production:

['mary', 'had', 'a', 'little', 'lamb'] 
vivek mishra
la source
Cela produit ce qui se trouve entre les (), c'est-à-dire rien du tout.
Anthon
7

Si vous voulez réellement des tableaux:

>>> 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 vous n'avez pas besoin de tableaux, et que vous voulez seulement regarder par index vos caractères, rappelez-vous qu'une chaîne est un itérable, tout comme une liste sauf le fait qu'elle est immuable:

>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> text[0]
'a'
Joaquin
la source
1
Par curiosité, après avoir fait myarray = array ('c', text), où est passé le "c"? puisque si vous tapez array, vous avez array ("c", "abc"), mais un [0] == a? Merci
Clinteney Hui
@Clinteney: Le 'c' signifie "créer un tableau de caractères". Voir la documentation pour plus d'informations
Cameron
J'ai voté pour, mais trop tôt. J'obtiens array ('c', '1 1 91 0.001 228') en appelant a = array ('c', e) where e = "1 1 91 0.001 228"
Valentin Heinitz
@ValentinHeinitz Oui, c'est ce que vous devez obtenir comme le montre mon exemple. Qu'attendez-vous ?
joaquin
1
@joaquin: Ok, je l'ai. Tout va bien avec la réponse. J'ai été déconcerté par la question "texte == [a, b, c]" devrait être "texte == ['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é
la source
Veuillez fournir des informations supplémentaires avec votre code afin que l'affiche originale puisse mieux comprendre comment cela résout son problème.
Ivan
4

Toutes les réponses sont bonnes, il existe une autre façon de faire, qui est la compréhension de liste, voir la solution ci-dessous.

u = "UUUDDD"

lst = [x for x in u]

pour une liste séparée par des virgules, procédez comme suit

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

lst = [x for x in u.split(',')]
Zeus
la source
Je ne comprends pas une seule ligne pour les boucles et je ne le ferai jamais
Mr PizzaGuy
1
@MrPizzaGuy c'est facile et très pratique lorsque vous l'utilisez, consultez ce youtube.com/watch?v=AhSvKGTh28Q
waghydjemy
1

J'utilise habituellement:

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

la stripsuppression des espaces autour des mots.

Yannick Loiseau
la source
1

Pour convertir un code stringayant la forme que a="[[1, 3], [2, -6]]"j'ai écrit mais pas optimisé:

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

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

Vous devez utiliser la fonction intégrée translate méthode pour les chaînes.

Tapez help('abc'.translate)sur Python shell pour plus d'informations.

N 1.1
la source
0

Utilisation de Python fonctionnel:

text=filter(lambda x:x!=',',map(str,text))
Ératosthène
la source