11
votes

Comment puis-je convertir cette chaîne à la liste des listes?

Si un utilisateur type dans [[0,0,0], [0,0,1], [1,1,0]] et appuyez sur Entrée, Le programme devrait convertir cette chaîne à plusieurs listes; une liste tenant [0] [0] [0] , autre pour [0] [0] [1] et la dernière liste pour [1] [1] [0]

Python a-t-il un bon moyen de gérer cela?


3 commentaires

Ce n'est pas clair ce que vous essayez de faire. Obtenez-vous l'entrée en tant que chaîne en utilisant Raw_Input () ou quelque chose de similaire?


entrée brute. Pardon. J'ai oublié de mentionner cela.


La réponse du personneur était la solution la plus simple que je pouvais comprendre instantanément à mon niveau Python. Cependant, grâce à tous les autres utilisateurs de Python, aussi! : D Lire toutes sortes de réponses différentes et créatives était très intéressante! Vous êtes géniaux les gars!


6 Réponses :


23
votes
>>> import json
>>> json.loads('[[0,0,0], [0,0,1], [1,1,0]]')
[[0, 0, 0], [0, 0, 1], [1, 1, 0]]

3 commentaires

Notez que cela analyse l'expression comme JSON, pas comme littéraux python. Pour les listes et les entiers et les chaînes, c'est la plupart des mêmes identiques. Pour d'autres types, comme des tuples, cela ne fonctionnera pas.


Ceci est seulement Python 2.6+ sans modules externes


@Thomas Wouters Êtes-vous les mêmes Thomas Wouters, qui explique Python Internals à Googlers?



0
votes
>>> 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]

0 commentaires

-3
votes
>>> 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]]
before passing your string to eval(), do the necessary sanitization first.

2 commentaires

S'il vous plaît ne suggérez pas eval () sans expliquer comment il exécute un code python complètement arbitraire.


Tout ce qu'il faut est un utilisateur d'entrer "sortie ()" ...



8
votes

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

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


5 commentaires

THX! C'était la solution la plus facile que je pouvais comprendre instantanément au niveau de mon python. Merci à d'autres utilisateurs de Python aussi! :RÉ


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


@Marcelo Cantos, merci pour votre conseil. Cela pourrait peut-être considérer comme une mauvaise solution si les utilisateurs pro Python le voient. Cependant, sa solution fonctionne simplement pour mon programme et il est facile d'expliquer aux autres. :) Surtout, je n'ai aucune idée de ce que les choses AST ou JSON sont ... et je me demandais si cela est possible sans importer de choses .. mais, encore une fois merci de votre conseil. Je vais jeter un coup d'œil à vos réponses aussi si je comprends Python plus profondément un jour!


C'est tout bien et bien, mais vous vous en récompensez de mauvais design et vous l'adoptez vous-même. Ce n'est ni un bon moyen de produire un bon code ni d'apprendre une nouvelle langue. Il est beaucoup préférable de suivre simplement la direction des personnes qui savent de quoi ils parlent et laissent la compréhension venir plus tard. Cire! Cirer! En outre, il n'est pas difficile de comprendre: importer ast; aide (ast.literal_eval) .


Je vais admettre que mon code est laid - mais personne n'a rien proposé de mieux qui suit les mêmes contraintes. Il est peut-être vrai que l'importation d'une bibliothèque est la bonne chose à faire en général, et à défaut qu'une solution récursive générale serait préférable, mais vous ne voulez peut-être pas vraiment faire de ces choses pour une raison obscure mais bonne. Une solution mon code pourrait être un peu moins éclectique consiste à utiliser une compréhension de la liste imbriquée au lieu de la carte ... au-delà de cela, existe-t-il une façon fondamentalement plus agréable rapide et sale de le faire?



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

4 commentaires

8 ans plus tard et toujours pertinents ... :)


9 ans plus tard, fonctionne toujours comme un charme. Recommandez un coup d'oeil à lien avant de l'utiliser.


brillant. parfait.


10 ans plus tard, et toujours la meilleure réponse - de loin.



3
votes

[[int (i) pour i in x.strip ("[]"). Split (",")] Pour x dans S.Strip ('[]'). Split ("] ")]

Une compréhension de la liste dans une compréhension de la liste ... Mais cela va fondre votre cerveau


0 commentaires