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> et tourné cela dans une liste: p> 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 +')
7 Réponses :
if '+' in '1 2 3 +':
lst = string.split() if '+' in lst: # Do addition elif '-' in lst: # Do subtraction
@Lad Merci, je vais essayer d'améliorer les réponses futures.
Il y a plusieurs problèmes ici. Le premier est Fixation de ces problèmes: P> 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.
6
Vous ne pouvez pas simplement prendre la somme, car la liste est au format à la chaîne, et "+" sera toujours une chaîne, donc: comme fonction: p > def sum_list(x):
if "+" in x:
total = sum([int(i) for i in x if not i == "+"])
return total
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 Cette structure est facilement étendue pour gérer d'autres opérations. Par exemple, vous pouvez utiliser + code> 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
+ code>, mais c'est assez simple pour mettre en œuvre. P>
+ code> pour addition binaire et
++ code> pour la somme tout. P>
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: 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
Essayez de faire ceci:
nums = [ int(i) for i in mylst if i in "1234567890"]
Comment envisagez-vous de traiter 3 numéros lorsque
+ code> est supposé un opérateur binaire?