2010-04-15 7 views
7

Si un utilisateur tape [[0,0,0], [0,0,1], [1,1,0]] et appuyez sur Entrée, le programme doit convertir cette chaîne en plusieurs listes; une liste tenant [0][0][0], autre pour [0][0][1], et la dernière liste pour [1][1][0]Comment puis-je convertir cette chaîne en liste de listes?

Est-ce que python ont une bonne façon de gérer cela?

+0

Il est pas clair ce que vous essayez de faire. Obtenez-vous l'entrée comme une chaîne en utilisant 'raw_input()' ou quelque chose de similaire? –

+0

raw_input. Pardon. J'ai oublié de mentionner cela. – Phrixus

+0

La réponse de Personman était la solution la plus simple que je pouvais comprendre instantanément à mon niveau python. Cependant, merci à tous les autres utilisateurs de pro python, aussi! : D Lire toutes sortes de réponses créatives différentes était très intéressant! Vous êtes géniaux les gars! – Phrixus

Répondre

1

Ceci est un peu plus flexible que celui de Satoru et n'utilise aucune bibliothèque. Cependant, cela ne fonctionnera pas avec des listes imbriquées plus profondément. Pour cela, je pense que vous auriez besoin d'une fonction récursive (ou loop), ou eval.

str = "[[0,0,0],[0,0,1],[1,1,0]]" 
strs = str.replace('[','').split('],') 
lists = [map(int, s.replace(']','').split(',')) for s in strs] 

La liste contient maintenant la liste des listes que vous souhaitez.

+0

Thx! C'était la solution la plus simple que je pouvais comprendre instantanément à mon niveau python. Merci aussi aux autres utilisateurs de Python! : D – Phrixus

+0

@Prixius, il y a une raison pour laquelle cette solution n'a eu aucun vote. C'est facilement la solution la plus laide et la plus perverse. Mon vote est pour la solution de @ S. Mark. –

+0

@Marcelo Cantos, Merci pour vos conseils. Peut-être que cela pourrait être considéré comme une mauvaise solution si les utilisateurs de Python le voient. Cependant, sa solution ne fonctionne que pour mon programme et c'est facile à expliquer aux autres. :) Surtout, je n'ai aucune idée de ce que sont les trucs ast ou json ... et je me demandais si c'était possible sans importer des choses .. Mais, encore une fois merci pour vos conseils. Je jetterai un coup d'oeil à vos réponses aussi si je comprends un peu plus profond python un jour! – Phrixus

17
>>> import json 
>>> json.loads('[[0,0,0], [0,0,1], [1,1,0]]') 
[[0, 0, 0], [0, 0, 1], [1, 1, 0]] 
+0

Ceci est seulement python 2.6+ sans modules externes – fabrizioM

+4

Notez que ceci traite l'expression comme JSON, * not * comme littéraux Python. Pour les listes et les entiers et les chaînes, c'est essentiellement la même chose. Pour les autres types, comme les tuples, cela ne fonctionnera pas. –

+0

@ Thomas Wouters Êtes-vous le même Thomas Wouters, qui explique les internes de Python aux googleurs? –

0
>>> import re  
>>> list_strs = re.findall(r'\[\d+\,\d+\,\d+\]', s) 
>>> [[[int(i)] for i in l[1:-1].split(',')] for l in list_str] 
-2
>>> string='[[0,0,0], [0,0,1], [1,1,0]]' 
>>> eval(string) 
[[0, 0, 0], [0, 0, 1], [1, 1, 0]] 
>>> a=eval(string) 
>>> a 
[[0, 0, 0], [0, 0, 1], [1, 1, 0]] 

avant de passer votre chaîne à eval(), faire le nécessaire sanitization premier.

+5

Veuillez ne pas suggérer eval() sans expliquer comment il exécute du code Python complètement arbitraire. –

+0

tout ce qu'il faut, c'est un utilisateur pour entrer "exit()" ... – thepandaatemyface

17
>>> import ast 
>>> ast.literal_eval('[[0,0,0], [0,0,1], [1,1,0]]') 
[[0, 0, 0], [0, 0, 1], [1, 1, 0]] 

Pour tuples

>>> ast.literal_eval('[(0,0,0), (0,0,1), (1,1,0)]') 
[(0, 0, 0), (0, 0, 1), (1, 1, 0)] 
1

[[int(i) for i in x.strip(" []").split(",")] for x in s.strip('[]').split("],")]

une compréhension de liste dans une compréhension de la liste ... mais qui va faire fondre votre cerveau

Questions connexes