2013-05-25 2 views
1

Par exemple,Comment séparer les listes séparées par des virgules

string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']" 

Comment puis-je faire une nouvelle liste à chaque liste ci-dessus comme un élément de ma nouvelle liste?

J'ai essayé de faire

string = string.split (',') 

mais il divise par les virgules dans mes listes aussi, ce qui est quelque chose que je ne veux pas.

+3

Wh at est votre but éventuel? –

+1

'ast.literal_eval ('[' + chaîne + ']')'? – Blender

+0

Vous pourriez diviser sur '], [' .. –

Répondre

5

Vous pouvez utiliser ast.literal_eval:

>>> import ast 
>>> strs = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']" 
>>> ast.literal_eval("[" + strs + "]") 
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']] 
+0

+1 la meilleure façon – jamylak

0

Une seule ligne qui fonctionnerait pour votre exemple précis:

>>> string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']" 
>>> [x.split(', ') for x in string[1:-1].replace("'", "").split('],[')] 
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']] 

Ceci est fragile, car cela dépend des chaînes de travail exactement comme vous avez les ont disposés. Il applique les étapes suivantes:

  1. string[1:-1] - jeter le [ et ] cette tranche de la chaîne.
  2. replace("'") - rejette toutes les guillemets simples car elles n'aideront pas la scission.
  3. split('],[') - divisez la chaîne la plus externe de la sous-chaîne qui relie les sous-listes.
  4. [x.split(', ') pour x dans ... - FOR EACH GENERATED SUBSTRING, split that substring on its internal pair connector - in this case, `.

Ceci est plus une preuve de concept que cela peut être fait, plutôt qu'une très bonne idée. C'est une solution très fragile, car toute irrégularité dans l'espacement ou la citation va la casser.


Une meilleure solution serait d'utiliser une expression régulière pour trouver les sous-chaînes qui correspondent à des listes, obtenir une liste de ceux et celles processus dans des listes.

regex_string = '(?<=\[)[^\]]+(?=\])' 
matcher = re.compile(regex_string) 
substring_list = matcher.findall(string) 
list_of_lists = [x.split(', ') for x in substring_list] 
0
>>> for i in string.split(","): 
...  print i 
... 
['SING' 
'Dance'] 
['Talk' 
'Scream'] 
['Run' 
'Walk'] 
+1

Voici ce qu'il a dit avoir fait. – squiguy

1
>>> eval("['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']") 
>>> (['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']) 
>>> 
>>> list(eval("['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']")) 
>>> [['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']] 

Pourquoi eval("'a',2,[12,'bb']") retour ('a', 2, [12, 'bb']) alors il n'y a pas ( devant et pas ) à la fin de la chaîne évaluée?
Nous devons penser à how the interpreter acts when it encounters the evaluated expression as the right part of an expression from which it performs an unpacking.
Lorsque l'interpréteur exécute la ligne suivante (dans laquelle il n'y a pas parens)

x,y,z = 'a',2,[12,'bb'] 

ce qui est réalisé est:
- évaluation de la partie droite, c'est faire eval("'a',2,[12,'bb']") et il crée un tuple
- évaluation de la partie gauche
- déballage du droit tuple dans le tuple gauche

+2

http://stackoverflow.com/a/1832957/1971805 – TerryA

+0

@Haidro Je sais qu'il est difficile d'utiliser ** eval() **. Mais je pense que c'est à tout le monde de prendre soin des conditions dans lesquelles on l'utilise. C'est pourquoi c'est un bon point de donner un lien vers cette information. Mais lisez aussi les commentaires de S.Lott et Martineau sur la page que vous avez fournie. Si c'était tellement dangereux, pourquoi est-il toujours présent en Python? Je pense que nous devons éviter d'avoir des réflexes pavloviens chaque fois que nous voyons certains sujets comme 'eval', 'regex pour HTML', etc – eyquem

Questions connexes