Comment puis-je diviser une chaîne dans une liste?
Si j'ai cette chaîne:
2+24*48/32
qu'est-ce que l'approche la plus efficace pour la création de cette liste:
['2', '+', '24', '*', '48', '/', '32']
- Vous souhaitez découper une chaîne en une liste, mais vous ne voulez pas l'utiliser .split (), car elle retourne une liste? Vous êtes contredire vous-même. Si vous ne voulez pas d'une liste, alors qu'est-ce que vous voulez?
- Je pense que Jibmo signifie que la fonction split() ne vous permet de spécifier un délimiteur, donc il aurait du l'appeler une fois pour le '+', une fois pour '-', une fois pour '/', etc...
- désolé pour la mauvaise explication, ce que je voulais dire, c'est que la répartition sera de retour une liste, ce qui signifie que pour la fraction de seconde, j'ai maintenant besoin d'itérer sur des chaînes de caractères dans une liste. syntaxly exemple incorrect.. string = "2+2-2" liste = string.split(+) renvoie ['2', '+', '2-2'] maintenant, j'ai besoin d'itérer sur 3 cordes
- Vous devez mentionner que vous travaillez sur un programme qui doit être en mesure d'évaluer ces chaînes de caractères comme des expressions arithmétiques. Jerub réponse du couvre, mais c'est parce qu'il est un mindreader.
- Pourquoi ne pas simplement utiliser les SymPy? Il devrait faire ce que vous voulez réaliser.
- Il n'est pas clair si vous travaillez avec des flotteurs/décimales ou en entiers ? Je veux dire, si le '.' (ou ',' pour certains pays) soit divisé trop ?
InformationsquelleAutor | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
Il se trouve que les jetons que vous voulez diviser sont déjà Python jetons, de sorte que vous pouvez utiliser le haut-
tokenize
module. C'est presque un one-liner:STRING=1
vous pouvez utiliser la constante de latoken
module en faisant unfrom token import STRING
. Ceci est particulièrement utile si vous avez besoin de plusieurs jeton constantes.Vous pouvez utiliser
split
de lare
module.re.split(pattern, string, maxsplit=0, flags=0)
Exemple de code:
\D
Matches consécutifs ou chiffres consécutifs non chiffres.
Chaque match est retourné comme un nouvel élément dans la liste.
En fonction de l'utilisation, vous devrez peut-être modifier l'expression régulière. Comme si vous avez besoin de faire correspondre des nombres avec une virgule.
Cela ressemble à une analyse du problème, et donc je suis obligé de présenter une solution basée sur l'analyse des techniques.
Alors qu'il peut sembler que vous voulez "split" de cette chaîne, je pense que ce que vous voulez faire est de 'marquer' il. La segmentation ou lexxing est l'étape de la compilation avant l'analyse. J'ai modifié mon premier exemple dans un edit pour mettre en œuvre une bonne récursive décent analyseur ici. C'est le moyen le plus facile à mettre en œuvre un analyseur à la main.
Mise en œuvre de la manipulation de supports est laissé comme exercice pour le lecteur. Cet exemple sera correctement la multiplication avant l'addition.
tokenize
: Pourquoi utiliserre
pour supprimer l'espace sur une chaîne intégrée de la fonction?C'est une analyse de problème, donc ni regex pas split() sont la "bonne" solution. L'utilisation d'un analyseur générateur de la place.
Je regarde de près pyparsing. Il y a également eu quelques bons articles sur pyparsing dans le Python Magazine.
Expressions régulières:
Vous pouvez étendre à l'expression régulière pour inclure d'autres caractères que vous souhaitez diviser sur.
Une autre solution à ce problème serait d'éviter d'écrire une calculatrice comme ça tout simplement. L'écriture d'un RPN analyseur est beaucoup plus simple, et ne dispose pas de l'ambiguïté inhérente à l'écriture des mathématiques avec la notation infixe.
Cela fera l'affaire. J'ai rencontré ce genre de problème avant.
Ceci ne répond pas à la question exactement, mais je crois qu'il résout de ce que vous essayez d'atteindre. Je voudrais ajouter un commentaire, mais je n'ai pas l'autorisation de le faire encore.
Personnellement, je voudrais profiter de Python mathématiques des fonctions directement avec exec:
result = eval(expression)
?je suis sûr que Tim signifiait
si vous copiez exactement ce qu'il a vers le bas, vous obtenez seulement la
digits
pas leoperators
.