0
votes

Comment prendre la somme lorsque '+' est présent?

Je travaille avec la notation et les piles post-fixes, et je me demande si / comment je peux résumer les éléments d'une liste, de pile, etc. lorsque la chaîne '+' est présente?

pour l'exemple , Je vais simplement utiliser une liste au lieu d'une pile (bien que si vous avez une solution pour la pile, par tous les moyens, allez-y). P>

Alors, peut-être si j'avais: P> xxx pré>

et tourné cela dans une liste: p> xxx pré>

si correct évaluerait: P>

def post_fix(string):
     lst = []
     for i in string:
         if '(' in lst:
             pass
         elif valid(i) is True:      
             int(i)
             lst.append(i)
         elif '+' in string:
             '+' == sum(lst)
             print(sum(lst))

  post_fix('1 2 3 +')


1 commentaires

Comment envisagez-vous de traiter 3 numéros lorsque + est supposé un opérateur binaire?


7 Réponses :


0
votes
if '+' in '1 2 3 +':

0 commentaires

0
votes
lst = string.split()
if '+' in lst:
    # Do addition
elif '-' in lst:
    # Do subtraction

1 commentaires

@Lad Merci, je vais essayer d'améliorer les réponses futures.



1
votes

Il y a plusieurs problèmes ici. Le premier est int (i) code>. Cela ne crée pas une copie de i code> comme un entier mais ne modifie pas i code> du tout. Le i code> que vous ajoutez à la liste est toujours une chaîne. Le deuxième problème est que cela ne fonctionne pas pour deux chiffres à deux chiffres - vous appendez immédiatement à la liste au lieu de garder une trace des numéros de deux chiffres possibles.

Fixation de ces problèmes: P>

6


0 commentaires

0
votes

Vous ne pouvez pas simplement prendre la somme, car la liste est au format à la chaîne, et "+" sera toujours une chaîne, donc: xxx pré>

comme fonction: p >

def sum_list(x):
    if "+" in x:
        total = sum([int(i) for i in x if not i == "+"])
    return total


0 commentaires

3
votes

Vous évaluez la notation postfix à l'aide d'une pile. Lorsque vous voyez un numéro, vous le poussez sur la pile. Lorsque vous voyez un opérateur, vous avez suffisamment de numéros pour le satisfaire et pousser le résultat. À la fin, la pile ne doit avoir qu'un seul élément et vous l'imprimer.

Maintenant généralement + est un opérateur binaire: il faut deux opérandes. Dans votre cas, vous voulez qu'il consomme ce qui est sur la pile. C'est une signification non conventionnelle pour + , mais c'est assez simple pour mettre en œuvre. xxx

Cette structure est facilement étendue pour gérer d'autres opérations. Par exemple, vous pouvez utiliser + pour addition binaire et ++ pour la somme tout. xxx


0 commentaires

0
votes

Faire ce qui suit devrait fonctionner pour le cas d'addition (+) étant la dernière valeur de votre chaîne. Vous pouvez ajouter des conditions supplémentaires à la méthode post_fix puis pour -, *,% etc: xxx pré>

juste pour paniquer cette ligne au cas où sa ligne n'est pas claire: P>

filtered_digits = filter(lambda x: x.isdigit(), split_string)  # Checks if the string is a digit and adds it to the filtered_digits list
casted_to_int = map(int, filtered_digits)  # Casts all values found to be str representation of ints to int through the map function
result = sum(casted_to_int)  # sums our list of integers


0 commentaires

1
votes

Essayez de faire ceci:

nums = [ int(i) for i in mylst if i in "1234567890"]


0 commentaires