(1) 2 »


Comparaisons d'un ensemble de valeurs
Fou Furieux du Clan
Inscrit:
03/12/2010 20:21
Post(s): 203
Bonjour à tous,
je débute dans la programmation et j'aimerais savoir comment comparer un ensemble de valeurs.
Ici g, h, i, k ceci afin de déterminer s'il existe au moins une égalité entre plusieurs d'entre elles...
Pour le moment je le fais deux à deux, ça fonctionne, mais pour un ensemble plus conséquent cela devient très fastidieux.
if g==h: pass else :
     if g==i: pass
     else :
         if g==j: pass
         else :
             if g==k: pass
             else :
                 if h==i: pass
                 else :
                     if h==j: pass
                     else :
                         if h==k: pass
                         else :
                             if i==j: pass
                             else :
                                 if i==k: pass
                                 else :
                                     if j==k: pass
                                     else :


Je ne doute pas qu'il existe une méthode plus efficace, merci encore à vous de partager connaissances.

Bien à vous, makhaon.

Contribution le : 10/10/2019 05:49
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
12/11/2013 14:22
Post(s): 1541
Salut, ça réduit pas le nb de tests (mais je vois pas comment en faire moins...), mais ça fait un code plus court et généralisable à n'importe quel nombre de valeurs :

valeurs=[5,3,4,7,8,4,6] # ton ensemble de valeurs
n=len(valeurs) # sa longueur 
doublon=False
for i in range(n): # range(n) désigne [0,1,...,n-1]
    for j in range(n):
        if (i!=j and valeurs[i]==valeurs[j]):
            doublon=True
            break
if doublon:
    # instructions si un doublon a été trouvé
else :
    # instructions si pas de doublon trouvé


Je connais pas bien l'instruction pass donc j'ai fait avec un break mais j'imagine que ça reste dans la même idée.

Edit : je viens de tester, pour vérifier, quand même. Bien écrire 'True' et pas 'true' ou 'TRUE' pour les valeurs booléennes.

Contribution le : 10/10/2019 08:43
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 2029
Salut makhaon, busanga,

L'instruction "pass", signifie simplement "passer". Par exemple, c'est utile si on n'a pas de choses à faire faire, hormis un "print".

En général, on utilise ça pour un test et une exception ("try"->"except").

Attention pour le "break", si il y a plus de valeurs comparables, il ne les fera pas toute, je pense.

Je veux dire par là que dés qu'il trouve une valeur qui correspond, python s’arrêtera là et mettra fin à la boucle, sans tester les autres valeurs, sauf si la bonne valeur est à la fin de la liste.

J'avais pensé à faire comme ça:

liste = [0, 1, 2, 3, 4, 5]

if nbr in liste:
   faire quelque chose

Contribution le : 10/10/2019 10:15
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
Fou Furieux du Clan
Inscrit:
03/12/2010 20:21
Post(s): 203
Merci, à vous deux busanga et Redstar, d'abord pour la rapidité de vos réponses et surtout pour leurs précisions.
Je viens de tester la solution de busanga qui fonctionne parfaitement et évidement est très économe en lignes et surtout en indentations.
Pour le "try" et "exept", j'ignorais complètement, mais comme j'en suis encore à vérifier les résultats sur la console, pour l'instant j'en reste au "pass". J’essaierais ta solution cet après midi Redstar...Et je vous tiens au courant.
Merci encore, makhaon.

Contribution le : 10/10/2019 10:36
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
12/11/2013 14:22
Post(s): 1541
@moonboots : oui effectivement ça ne détectera pas tous les doublons, et s'arrêtera au premier trouvé

@makhaon : petite optimisation de mon code :

if(i<j and ...)


au lieu de :

if(i!=j and ...)


sera suffisant et fera moitié moins de tests (si la valeur i n'est pas égale à la valeur j, pas la peine de vérifier plus tard si la valeur j est égale à la valeur i)

Contribution le : 10/10/2019 17:25
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
29/04/2007 19:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3774
Pour avoir quelque chose qui tient la charge quand on augmente le nombre de variables, il faut éviter de comparer toutes les paires.

Première étape, ne comparer chaque valeur qu'aux précédentes. Imaginons un instant que dans (a, b, c, d, e, f, g) tu aies un doublon, a == d. Tu ne veux pas un code qui commence par "if a == d: ..." et continue un peu plus loin par "if d == a: ...".

Ensuite, idéalement, on ne veut pas comparer les paires du tout en fait. C'est quadratique : chacune des N variables doit être comparée aux N-1 précédentes, et le nombre total de comparaisons est de l'ordre de N² (plus précisément, (N² + N)/2). N², c'est trop, alors qu'on peut faire ça en temps linéaire : plutôt que de comparer chaque variables à toutes les précédentes une par une, on va regarder si chaque variable est dans l'ensemble des précédentes. Le temps de vérification ne dépend pas du nombre d'éléments dans l'ensemble (parce que les HashSets, c'est de la sorcellerie).

Ce qui nous donne :
variables = [g, h , i, j, k, l, m]
précédentes = set()
for variable in variables:
    if variable in précédentes:
        print("On a un doublon, faire un truc !")
    précédentes.add(variable)


Bonus : un set est une collection non ordonnée mais sans doublon. Si ton but est seulement d'éliminer les doublons, on de t'assurer qu'il n'y en a pas, tu peux faire encore plus simple :
variables = {g, h, i, j, k, l, m, n} # tu peux itérer sur variables, il n'y aura pas de doublon

Contribution le : 10/10/2019 21:46
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
12/11/2013 14:22
Post(s): 1541
@DWB : je digresse un peu, mais au final le test "if ... in ..." ne cache-t-il pas une seconde boucle, de plus en plus longue au fur et à mesure que la liste se remplit ? Dans ce cas on reste bien dans un nombre d'opérations de l'ordre de n²/2, et pas linéaire me semble-t-il.

for variable in variables: # n boucles
    if variable in précédentes: # potentiellement 1 test, puis 2, puis 3...


Edit : oups, j'ai rien dit :

Citation :
Le temps de vérification ne dépend pas du nombre d'éléments dans l'ensemble (parce que les HashSets, c'est de la sorcellerie).

Contribution le : 10/10/2019 22:04
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 2029
Attention busanga que c'est "for" qui crée la boucle, qu'il y aie une correspondance ou pas via le "if... in...", la boucle se fera au prorata de la taille de la liste à vérifier.

Cela vaut pour quiconque lit ce topic, bien entendu.

Contrairement à "while", qui exige un début et absolument une fin. "For", lui, il est plus... débrouillard.

Contribution le : 11/10/2019 10:23
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
12/11/2013 14:22
Post(s): 1541
la boucle se fera au prorata de la taille de la liste à vérifier


Justement, DWB semble dire le contraire (et je veux bien le croire même si c'est un peu déroutant...)

Contribution le : 11/10/2019 11:53
Créer un fichier PDF de la contribution Imprimer


Re: Comparaisons d'un ensemble de valeurs
OverdOzed
Inscrit:
29/04/2007 19:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3774
Voui. Un set, ça fait de la sorcellerie. En termes non-techniques:
- Pour ajouter un élément à une liste, on le pose à côté des éléments déjà présents, sans trou. L'implémentation varie, mais dans tous les cas on a une structure compacte ou les éléments sont rangés dans l'ordre d'insertion, mais aucune information sur ce qu'on peut s'attendre à trouver à un emplacement donné, ni sur l'emplacement où on peut s'attendre à trouver un élément donné. Donc, chercher dedans consiste à énumérer tous les éléments : "C'est celui-ci ? Ah, non. C'est le suivant ? Ah, non. C'est le suivant ? Ah, non." Donc, plus la liste est longue, plus le temps moyen pour trouver un élément dedans est long.

- Pour ajouter un élément à un set, on commence par calculer où il devrait être. Et on le met là, peu importe si on fait des trous dans la structure. En conséquence, chercher un élément dans la liste devient très simple : est-ce qu'il est à l'endroit où je m'attendrais à le trouver ?
Ce calcul ne dépend pas de la taille de l'ensemble. Il est beaucoup plus lourd, en général, que la comparaison "est-ce que c'est celui-ci ?", mais on ne le fait qu'une fois, quelle que soit la taille de l'ensemble (aux cas pathologiques près).

Un set prend donc plus de place, puisqu'on accepte de faire des trous, mais gagne énormément en temps de calcul.

Contribution le : 11/10/2019 18:11
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
The Blender Clan 'tchat Buy (5 Pcs) New Samsung Galaxy S23 Ultra 256GB $4,495 Website: www.cutebitelectronics.com 0 22 Aujourd'hui 10:37:12
emailychang01 
Questions & Réponses [non résolu] Blender et OBJ 0 59 01/02 11:09:31
stigmamax 
Mes premières images sous Blender (débutants) 2.80 ---> 3.00 ? 2 118 31/01 15:27:50
HarDrive 
The Blender Clan 'tchat Buy (50 Pieces) New Samsung Galaxy Z Flip4 128GB Unlocked $17,450 0 90 26/01 07:44:35
emailychang01 
The Blender Clan 'tchat Buy (30 Pcs) New Mac mini M2 (2023) 256GB SSD $8,970: www.cutebitelectronics.com 0 58 25/01 11:02:28
emailychang01 
The Blender Clan 'tchat Buy (50 Pcs) New iMac M1 24-inch (2021) 512GB SSD $44,950 Website: www.cutebitelectronics.com 0 77 24/01 09:21:49
emailychang01 
The Blender Clan 'tchat Buy (50 Pcs) Macbook Air M2 13.6-inch 512GB SSD $54,950 Website: www.cutebitelectronics.com 0 86 23/01 09:20:38
emailychang01 
Questions & Réponses circuit avec dévers 3 123 22/01 18:42:26
moonboots 
The Blender Clan 'tchat Buy (50 Pcs) MacBook Pro M2 14-inch 512GB SSD $79,950 0 74 21/01 10:19:51
emailychang01 
The Blender Clan 'tchat Buy (50 Pieces) New Apple iPad Air 10.9-inch (2022) 256GB Wi-Fi + Cellular $24,950 0 103 20/01 08:43:41
emailychang01 
The Blender Clan 'tchat Buy (50 Pcs) New Mac mini M2 (2023) 256GB SSD $9,950 Website: www.cutebitelectronics.com 0 102 19/01 08:19:28
emailychang01 
The Blender Clan 'tchat Buy (50 Pieces ) New Apple iPad Mini 8.3-inch (2021) 256GB Wi-Fi + Cellular $22,450 0 77 18/01 08:46:54
emailychang01 
Hors Sujet !! Victime de piratage 0 147 18/01 00:01:38
Lylo 
The Blender Clan 'tchat Buy (50 Pieces) New Apple iPad Pro 12.9-Inches 2021 1TB Wifi + Cellular $69,950 0 96 17/01 09:54:03
emailychang01 
The Blender Clan 'tchat Buy (50 Pieces) New Apple iPad Pro 11-Inches 2021 2TB Wifi + Cellular $79,950 0 98 14/01 19:23:01
emailychang01 
Questions & Réponses [non résolu] Material preview et résolution 0 115 13/01 10:13:25
zeromeetsinfinity 
The Blender Clan 'tchat Buy (50 Pieces) New Original Unlocked Apple iPhone 13 Pro Max 5G 1TB $54,950 0 101 12/01 09:21:35
emailychang01 
Hors Sujet !! Verifpro.net - paypal, ebay, banks, crypto, docs and more! 0 102 11/01 18:57:13
julien_costa 
The Blender Clan 'tchat Buy (50 Pieces) New Original Unlocked Apple iPhone 12 Pro 5G 512GB $24,950 0 104 11/01 07:45:50
emailychang01 
Questions & Réponses [non résolu] Soucis de pivots et rotations à l'import dans un fichier fbx avec parents/enfants 0 4613 10/01 16:32:57
Brice_Willus 

Qui est en ligne
131 utilisateur(s) en ligne (dont 95 sur Forums)

Membre(s): 1
Invité(s): 130


LatashaTal, plus...
Nouveaux membres
MathiasFul 18/8/2022
VicenteZcl 18/8/2022
OlivaL1007 18/8/2022
Adrian8943 18/8/2022
NorbertoGe 18/8/2022
VeronaKais 18/8/2022
BettieSile 18/8/2022
DarylTier 18/8/2022
BretParkhi 18/8/2022
LeoTrotter 18/8/2022
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Fev 15
Anniversaire de Dany
Fev 23
anniversaire de windspirit
Mar 14
Anniversaire de AMV12
plus 229 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2021 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445