Fonction de tri un peu complexe (python)

Résolu/Fermé
MEZIANE002 - Modifié le 22 mai 2022 à 11:49
yg_be Messages postés 23486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mars 2025 - 22 mai 2022 à 19:56
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
[['%', 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:

2 réponses

yg_be Messages postés 23486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mars 2025 Ambassadeur 1 570
22 mai 2022 à 12:45
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.
0
et quelle serait la solution ?
0
yg_be Messages postés 23486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mars 2025 1 570 > MEZIANE002
Modifié le 22 mai 2022 à 13:32
pourquoi ne pas laisser python faire le tri?
def cle(v):
    return -op[v[0]]

def ordre(l):
    r=sorted(l,key=cle)
    return r
0
MEZIANE002 > yg_be Messages postés 23486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mars 2025
22 mai 2022 à 16:30
Ah, j'avais trouvé la solution tout seul
def get_max(l):
global op
m=1
for i in l:
if op[i[0]] > m:
m = op[i[0]]
return m

def ordre(l):
global op
mem = l
ret=[]
n=1
while mem != []:
for i in range(len(mem)):
if op[mem[i][0]] == get_max(mem):
ret.append( mem[i])
mem.pop(i)
break
return ret


Mais la tienne est 10x plus courte que la mienne donc merci et gg.
0
yg_be Messages postés 23486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mars 2025 1 570 > MEZIANE002
Modifié le 22 mai 2022 à 17:23
deux défauts à ton code:
- tu appelles get_max() beaucoup trop souvent, tu dois l'appeler hors de la boucle
for i
.
- get_max() te retourne le maximum, alors que tu as besoin de l'index du maximum
optimisé:
def get_max(l):
    global op
    m=-1
    for i in range(len(l)):
        v=op[l[i][0]]
        if v > m:
            m = v
            x = i
    return x
    
def ordre(l):
    global op
    mem = l
    ret=[]
    n=1
    while mem != []:
        i=get_max(mem)
        ret.append( mem[i])
        mem.pop(i)
    return ret
0
yg_be Messages postés 23486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mars 2025 1 570 > MEZIANE002
22 mai 2022 à 17:26
pourquoi fais-tu
mem = l
? Cela ne sert à rien, cela ne fait rien.
0
jee pee Messages postés 40933 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 15 mars 2025 9 562
Modifié le 22 mai 2022 à 13:33
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 :
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.



0