IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

la méthode update des ensembles fournit-elle toujours un ensemble trié


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ancien auditeur informatique (à la retraite)
    Inscrit en
    Septembre 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : ancien auditeur informatique (à la retraite)
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2019
    Messages : 13
    Par défaut la méthode update des ensembles fournit-elle toujours un ensemble trié
    Bonjour,

    j'utilise pour la 1ère fois la méthode update des ensembles, et j'obtiens un ensemble trié.

    Cela me convient bien, mais j'aimerais comprendre si c'est un hasard ou si je peux être sûr de toujours obtenir un ensemble trié; je n'ai rien trouvé à ce sujet dans les docs que j'ai pu lire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    gripo=[[[10] for x in range(3)]for y in range(3)]
    gripo[2][1]=[5,8]
    gripo[2][2]=[1,6,7]
    print('liste',gripo[2])
    g=set()
    for j in range(3): g.update(gripo[2][j])   
    print('set',g)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Salut,

    Citation Envoyé par amitoum Voir le message
    si c'est un hasard ou si je peux être sûr de toujours obtenir un ensemble trié; je n'ai rien trouvé à ce sujet dans les docs que j'ai pu lire.
    En cherchant un peu sur Internet, vous auriez trouvé ceci qui explique cela (et non ce n'est pas un hasard pour les "petits entiers"...)

    Ou bien tester un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> {300, 200, 1}
    {200, 1, 300}
    >>> {1,200, 300 }
    {200, 1, 300}
    >>>
    et constater que peu importe le mélange, ce sera trié suivant la valeur du hash.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par amitoum Voir le message
    Cela me convient bien, mais j'aimerais comprendre si c'est un hasard ou si je peux être sûr de toujours obtenir un ensemble trié;
    Mis à part aller lire la doc officielle, l'autre solution est de tester. Si le test donne toujours un résultat trié alors on ne peut pas conclure sans aller quand-même lire la doc mais si le test ne donne ne serait-ce qu'un seul résultat non trié...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> set(("pim", "pam", "poum"))
    {'poum', 'pim', 'pam'}
    Et voilà.

    C'est vrai (et ça tu ne pouvais pas le savoir) que les nombres entre -5 et 255 ne sont pas de bons candidats pour tester les choses (leur hash ne change jamais) mais un bon test doit se faire dans diverses configurations.

    Citation Envoyé par amitoum Voir le message
    je n'ai rien trouvé à ce sujet dans les docs que j'ai pu lire.
    https://www.google.fr/search?q=pytho...client=gws-wiz => Un ensemble est une collection d'éléments non ordonnée...(en première réponse)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Homme Profil pro
    ancien auditeur informatique (à la retraite)
    Inscrit en
    Septembre 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : ancien auditeur informatique (à la retraite)
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2019
    Messages : 13
    Par défaut remarque sur la doc officielle
    @Sve@r

    Bonjour,

    je n'avais pas consulté la doc officielle car j'ai déjà constaté à plusieurs reprises qu'elle n'est pas toujours très facile à comprendre pour un débutant en Python.

    J'ai eu l'impression, à tort ou à raison, qu'elle n'est pas destinée à des débutants en Python pour leur permettre de mieux comprendre les bases du langages,
    mais plutôt à des utilisateurs confirmés pour leur permettre de trouver des précisions sur un point pour lequel ils ont une hésitation.

    Sur votre conseil, j'ai quand même pris la peine de la consulter attentivement mais je n'ai rien trouvé au sujet de la question que j'ai posée malgré plus de 2 heures de recherches.
    Je suis parti de la définition de set (j'en ai d'ailleurs trouvé 2 légèrement différentes), de hachable, de la fonction hash, de la fonction native hash, de l'opérateur eq, des comparaisons de valeurs, des comparaisons riches etc...

    Voici par exemple la définition de hachable que j'ai trouvée:
    hachable
    Un objet est hachable s'il a une empreinte (hash) qui ne change jamais (il doit donc implémenter une méthode __hash__()) et s'il peut être comparé à d'autres objets (avec la méthode __eq__()). Les objets hachables dont la comparaison par __eq__ est vraie doivent avoir la même empreinte.

    Mais après ces recherches, je ne sais pas ce qui est hachable et ce qui ne l'est pas. Bref, je reste sur ma faim ... et sur mon impression initiale.

    J'ai compris d'après la page indiquée par wiztricks que sur des entiers de 1 à 9, les valeurs de hachages sont en principe égales à l'entier concerné mais comme je ne sais pas exactement dans quel contexte ceci est vrai, je vais quand même trier le résultat que j'obtiens par sécurité quitte à faire des opérations inutiles.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Citation Envoyé par amitoum Voir le message
    Mais après ces recherches, je ne sais pas ce qui est hachable et ce qui ne l'est pas. Bref, je reste sur ma faim ... et sur mon impression initiale.
    Partez de la définition qui existe sur Wikipedia... elles s'appliquent à des "données" qui sont à priori "fixées".
    note: si j'utilise une fonction de hash pour détecter si une sauvegarde ou un fichier a été corrompu ou infesté par un virus, c'est que le fichier de départ est "fixé".

    A partir de là, imaginez étendre ce genre de fonction a des objets Python quelconques...
    Chaines de caractères et entiers ne sont pas "modifiables" et donc "hashable".
    Par contre, pour une liste (ou un set) qui à l'instant t sera [1, 2, 3] puis [] plus tard difficile de lui associer une valeur de "hash" pertinente à partir de son contenu => ce n'est pas hashable.

    Citation Envoyé par amitoum Voir le message
    J'ai eu l'impression, à tort ou à raison, qu'elle n'est pas destinée à des débutants en Python pour leur permettre de mieux comprendre les bases du langages,
    mais plutôt à des utilisateurs confirmés pour leur permettre de trouver des précisions sur un point pour lequel ils ont une hésitation.
    Vous devez avoir fait vos premiers pas en programmation pour pouvoir lire une documentation technique.... Et faire la différence entre savoir (un peu) programmer et apprendre à programmer en utilisant le langage Python (programmer étant aussi une pratique, un langage qui permet de mettre un peu les mains dans le cambouis est un "plus").

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amitoum Voir le message
    J'ai eu l'impression, à tort ou à raison, qu'elle n'est pas destinée à des débutants en Python pour leur permettre de mieux comprendre les bases du langages,
    mais plutôt à des utilisateurs confirmés pour leur permettre de trouver des précisions sur un point pour lequel ils ont une hésitation.
    C'est exact. Son avantage immédiat c'est qu'elle donne toutes les infos mais son inconvénient c'est que ces infos sont très techniques.
    Sinon il y a les tutoriels de débutants. Il sont plus explicites, plus détaillés... mais parfois négligent certains détails techniques tels que "qu'est-ce qu'un hash" etc.

    Citation Envoyé par amitoum Voir le message
    Sur votre conseil, j'ai quand même pris la peine de la consulter attentivement mais je n'ai rien trouvé au sujet de la question que j'ai posée malgré plus de 2 heures de recherches.
    Euh... tu as lu mon précédent post ainsi que le lien qui y était? Ta question était "un ensemble est-il ordonné" et dans mon post je te montre par un exemple facilement reproductible qu'il ne l'est pas (ou alors tu penses normal de sortir "poum" avant "pim"). Et le lien dit explicitement "un ensemble est une collection non ordonnée". Que te faut-il de plus ?????

    Citation Envoyé par amitoum Voir le message
    Je suis parti de la définition de set (j'en ai d'ailleurs trouvé 2 légèrement différentes), de hachable, de la fonction hash, de la fonction native hash, de l'opérateur eq, des comparaisons de valeurs, des comparaisons riches etc...

    Voici par exemple la définition de hachable que j'ai trouvée:
    hachable
    Un objet est hachable s'il a une empreinte (hash) qui ne change jamais (il doit donc implémenter une méthode __hash__()) et s'il peut être comparé à d'autres objets (avec la méthode __eq__()). Les objets hachables dont la comparaison par __eq__ est vraie doivent avoir la même empreinte.

    Mais après ces recherches, je ne sais pas ce qui est hachable et ce qui ne l'est pas. Bref, je reste sur ma faim ... et sur mon impression initiale.
    Oui mais là tu pars dans des détails techniques qui peuvent être intéressants mais qui ne te concernent pas encore. Le hash est une technologie permettant de créer des tableaux associatifs (ie des dictionnaires en Python) => https://fr.wikipedia.org/wiki/Tableau_associatif. Accessoirement ça n'a plus rien à voir avec ta question qui était "un ensemble est-il trié".
    Un hash c'est un calcul permettant de trouver un résultat fini appelé "empreinte" d'un élément potentiellement infini (exemple le md5 d'un fichier donne toujours 32 caractères quelle que soit la taille du fichier). Tu les as probablement déjà utilisés sans même t'en rendre compte. Par exemple le numéro de sécurité sociale comporte 13 chiffres plus deux autres. Ces deux autres sont le résultat des 13 premiers accolés en un super gros nombre. Ce nombre on en extrait le modulo 97 et à ce modulo on le retranche de 97 (expression mathématique f(secu)=97 - secu%97). Pourquoi 97? parce que c'est le plus grand nombre premier inférieur à 100 (limite les possibilités de collision => 2 numéros différents donnant le même résultat). Ce calcul est déjà un hash. Il permet de contrôler qu'un numéro de sécurité sociale est correct.
    Et il y a plein d'autres exemples. On trouve une clef dans les RIB, si on se trompe d'un chiffre en donnant son n° CB le système le reconnait. Même ton mot de passe est hashé et c'est son hash qui est enregistré dans ton OS. Quand tu te connectes et que tu donnes un mot de passe, le système vérifie juste si le résultat du hash du mot entré est le même que celui qui est stocké. Ainsi le mot de passe lui-même n'est pas stocké donc pas récupérable par un tiers.
    Même la "preuve par 9" qu'on apprend au cm1/cm2 pour vérifier ses multiplications et divisions c'est déjà un hash.

    Un dictionnaire en Python ne peut utiliser comme clef que des trucs qui ne changent pas et un truc qui ne change pas est un truc sur lequel on peut appliquer une fonction de hashage. Corollaire, si un truc n'est pas "hashable" (si on ne peut pas lui appliquer un calcul de signature) alors il ne peut pas servir de clef pour un dictionnaire.
    Et ensuite tu peux, quand tu crées tes propres objets, leur donner une fonction de hashage de ton cru en la codant dans la méthode "__hash__". C'est ce que dit la doc et on retombe là dans Python.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class toto:
    	def __init__(self, n): self.__n=n
    	def __hash__(self):
    		return self.__n % 3
     
    monDico={
    	hash(toto(1)) : "pim",
    	hash(toto(2)) : "pam",
    	hash(toto(3)) : "poum",
    	hash(toto(4)) : "xxx",
    }
    print(monDico)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/07/2007, 19h51
  2. Une liste déroulante est-elle toujours en 1er plan ?
    Par Marc365 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 01/05/2006, 20h16
  3. [Lex & Yacc] Gestion des ensembles d'entiers
    Par innosang dans le forum Générateurs de compilateur
    Réponses: 7
    Dernier message: 28/11/2005, 19h26
  4. Réponses: 4
    Dernier message: 04/10/2005, 14h37
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo