0
votes

Les intrigues doivent être converties en tuples

J'ai un fichier d'entrée qui ressemble à ce qui suit:

4 * 2 ^ 3 + 4 ^ 1 2 * 1 ^ 2 + 2 ^ 3

et il pourrait y avoir plus de lignes. Ce que je dois faire, c'est d'extraire la valeur qui est avant le signe * , donc pour la première ligne qui correspond au 4 . Alors j'ai besoin de faire un tuple g = [(2,3), (4,1)] , de sorte que les tuples-paires sont séparées par le + , puis le paire elle-même par le ^ . xxx

maintenant si i impression termes i get ['2 ^ 3', '4 ^ 1'] , et si i imprimer x i get 4 , donc cela semble fonctionner. Mais maintenant, j'ai besoin d'obtenir ces valeurs dans le formulaire de tuple décrit. Si je me séparais sur '^' Je ne reçois pas le résultat nécessaire, mais ["[" ["2", "3 '," 1' "," 1 '] "] , qui n'est pas fonctionnel. Je l'ai essayé avec facteurs = str (termes.split ('^')) .

aussi j'ai besoin de faire une itération afin que cela fonctionne pour toutes les lignes, mais je peut le faire plus tard. Je veux d'abord m'assurer que cela fonctionne pour la première ligne.

Toute suggestion?


3 commentaires

Si je me sépare à nouveau sur '^' Je n'obtiens pas le résultat nécessaire . S'il vous plaît montrer votre code.


facteurs = str (termes.split ('^'))


Pourquoi utilisez-vous str partout?


4 Réponses :


1
votes

maintenant si i impression termes code> i get ['2 ^ 3', '4 ^ 1'] code> p> p>

alors pour chaque valeur (chaîne) dans termes code>, vous devez diviser sur '^', puis lancer chaque résultat sur INT et emballer en tuple: P>

g = [tuple(map(int, x.split('^'))) for x in terms]


0 commentaires

1
votes

Je collectionnerais d'abord tous les chiffres de la chaîne, attribuez-les à leurs tuples respectifs, puis attribuez-les à une liste.

[(2, 3), (4, 1)]

Process finished with exit code 0


0 commentaires

1
votes

Voici une meilleure façon de le faire:

import re

x = []
g = []
with open('input.txt') as infile:
    for line in infile:
        nums = re.split(r'[\*\^\+]', line)
        x.append(int(nums[0]))
        g.append((int(nums[1]), int(nums[2])))

print(x) # [4, 2]
print(g) # [(2, 3), (1, 2)]


1 commentaires

Nice, je ne savais jamais que vous pouviez scinder plusieurs personnages d'une ligne, très soigné :)



1
votes

Si vous analysez les expressions générales, vous voudrez peut-être construire un arbre d'analyse à la place:

add
  mul
    number      4
    exp
      number    2
      number    3
  exp
    number      4
    number      1


1 commentaires

Je n'étais pas familier avec ce type d'arbres d'analyse. Merci pour la perspicacité :)