Fonction de tri un peu complexe (python)
Résolu
MEZIANE002
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je cherche à faire un programme python qui analyse un str pour le calculer (je sais que la fonction eval existe déjà mais je veux créer le mien afin de setup mes propres opérations et fonctions etc...).
Une fonction du programme (la fonction "ordre") est censée trier les opérations selon l'ordre fourni dans un dictionnaire (le dictionnaire "op") mais au lieu d'afficher
cela m'affiche
Je ne sait pas ou est le problème, voila mon code :
Merci.
je cherche à faire un programme python qui analyse un str pour le calculer (je sais que la fonction eval existe déjà mais je veux créer le mien afin de setup mes propres opérations et fonctions etc...).
Une fonction du programme (la fonction "ordre") est censée trier les opérations selon l'ordre fourni dans un dictionnaire (le dictionnaire "op") mais au lieu d'afficher
[['%', 13], ['*', 7], ['/', 17],['+', 2], ['-', 22]]
cela m'affiche
[['%', 13], ['*', 7], ['+', 2], ['/', 17], ['-', 22]]
Je ne sait pas ou est le problème, voila mon code :
op = {
"+" : 2,
"-" : 1,
"*" : 4,
"/" : 3,
"^" : 5,
"%" : 4
}
#Fonction de collage d'instruction
def init(x):
c=""
for i in range(len(x)):
if x[i] != " ":
c+=x[i]
return c
""" Fonction qui verifie si il y a un nombre derrière le dernier caractère """
def check(x, pos):
if not x[pos-1] in "0123456789":
return True
else:
return False
def ordre(l):
global op
m=1
t=l
for i in l:
if op[i[0]] >= m:
t.remove(i)
t.insert(0, i)
m = op[i[0]]
return t
def get_operators(x):
global op
l = []
for i in range(len(x)):
if x[i] in op:
l.append([x[i],i])
return ordre(l)
def analyse(x):
c = init(x)
l = get_operators(c)
print(l)
analyse("12+1433*32376%232/3443-121")
Merci.
A voir également:
- Fonction de tri un peu complexe (python)
- Fonction si et - Guide
- Comment faire un tri personnalisé sur excel - Guide
- Citizen code python avis - Accueil - Outils
- Logiciel tri photo - Guide
- Fonction miroir - Guide
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
Comme tu le constates, ta fonction de tri ne trie pas.
Tu as inventé un nouvel algorithme de tri, qui, s'il fonctionnait, serait révolutionnaire, car il serait très rapide.
Comme tu le constates, ta fonction de tri ne trie pas.
Tu as inventé un nouvel algorithme de tri, qui, s'il fonctionnait, serait révolutionnaire, car il serait très rapide.
Bonjour,
Comme le fait remarquer yg_be ton tri n'en est pas un, il faut toujours rajouter des prints pour voir ce qui se passe :
une fois que m atteint un max les suivants ne sont pas traités. Tu devrais faire des recherches sur un tri manuel en python,voir par exemple : https://defeo.lu/M1-AlgoProg/tds/tris . Tu pourrais aussi dans get_ordre récupérer la valeur de l'opérateur ce serait plus simple après pour le tri.
Comme le fait remarquer yg_be ton tri n'en est pas un, il faut toujours rajouter des prints pour voir ce qui se passe :
def ordre(l): global op m=1 t=l for i in l: print(i) if op[i[0]] >= m: print(op[i[0]],m) t.remove(i) t.insert(0, i) m = op[i[0]] return t
une fois que m atteint un max les suivants ne sont pas traités. Tu devrais faire des recherches sur un tri manuel en python,voir par exemple : https://defeo.lu/M1-AlgoProg/tds/tris . Tu pourrais aussi dans get_ordre récupérer la valeur de l'opérateur ce serait plus simple après pour le tri.
Mais la tienne est 10x plus courte que la mienne donc merci et gg.
- tu appelles get_max() beaucoup trop souvent, tu dois l'appeler hors de la boucle .
- get_max() te retourne le maximum, alors que tu as besoin de l'index du maximum
optimisé: