Je n'arrive pas à comparer 3 chiffres à la fois

Résolu/Fermé
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - Modifié par geekat le 17/10/2016 à 15:57
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 21 oct. 2016 à 16:47
Bonjour,

J'ai fait un exemple simple pour comparer 3 chiffres par 3 et qui marche.
Le but est de chercher le minimum entre 3 chiffres à la fois.
0 1 2 3 4 5 6
i = 0
K = 3
while i <7:
     if min(i,i+1) = i:
           print("Le min est",i)
    else:
          print("le min est",i+1)
    i = i +K

Le min est 0
Le min est 3
Le min est 6



Maintenant, je souhaite implémenter ça dans mon code, qui est en fait l'algorithme de K-means. Je suis à la 2ème étape :
i = 0
K = 3
for pt in points_restants:
            for c in centres_initiaux:
                        distance_euclidienne = round(sqrt( (c[0]-pt[0])**2  +  (c[1]-pt[1])**2 ),2) 
                        print("de(",c,",",pt, ") = ", distance_euclidienne)
                        
                        liste_distances.append(distance_euclidienne)
            
            ## Liste des distances minimales 
            #distance_minimale = min (liste_distances[i],liste_distances[i+1])

            # Pt le plus proche de c = ça marche pour K=2
            if min (liste_distances[i],liste_distances[i+1]) == liste_distances[i]:
                distance_minimale = liste_distances[i]
            else:
                distance_minimale = liste_distances[i+1]

             i = i+3
             print(distance_minimale)

Le problème c'est que ça ne marche que pour K = 2 alors que dans l'exemple ça marche pour tout K. (ici il ne compare que pour les 2 premiers nombre)

Qu'est-ce qui ne va pas ?

Merci

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
18 oct. 2016 à 14:41
Salut,

Disclaimer : je ne suis pas un pro de Python, mais puisque ton message n'a pas eu de réponses, je me lance :-)

Ton exemple ne marche pas sur une liste arbitraire. Si on faisait manuellement, il faudrait comparer les 2 premiers éléments et obtenir le plus petit, et ensuite comparer cet élément au 3ème et déterminer le plus petit.

Là tu utilises la fonction Python min().

Or, la fonction standard min() accepte un tuple ou une liste (un objet itérable) avec un nombre arbitraire d'éléments et renvoie le plus petit.

https://docs.python.org/2/library/functions.html#min

Donc, tu peux successivement mettre tes groupes de 3 éléments dans une liste et les passer à min().

Cet exemple fonctionne pour moi, en créant la liste à la volée :

liste_distances = [151, 30, 2, 67, 8, 103, 10, 36, 78]
i = 0
k = 3

# le min des elements 0, 1, 2 est : 2
print min([liste_distances[idx] for idx in range(i,i+k)])
# min des elements 3, 4, 5 est : 8
i = i + k
print min([liste_distances[idx] for idx in range(i,i+k)])
# min des elements 6, 7, 8 est : 10
i = i + k
print min([liste_distances[idx] for idx in range(i,i+k)])

donne :
2
8
10

Dal
1
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
21 oct. 2016 à 16:47
Merci beaucoup, ça marche bien :)
0