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 :

Supprimer une valeur d'un set


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut Supprimer une valeur d'un set
    Bonjour,

    je souhaite réaliser la chose suivante à partir du dictionnaire suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d = {'Thierry': {'Michelle', 'Bernadette'}, 'Michelle': {'Thierry'}, 'Bernadette': set()}
    Le but est de créer une fonction avec deux paramètres : le premier le dictionnaire (que ladite fonction devra modifier et le second un booléen qui va indiquer comment la fonctionner doit modifier le dictionnaire d. On doit obtenir le résultat suivant la valeur du booléen

    si TRUE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d = {'Thierry': {'Michelle', 'Bernadette'}, 'Michelle': {'Thierry'}, 'Bernadette': {'Thierry'}}
    si FALSE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d = {'Thierry': {'Michelle'}, 'Michelle': {'Thierry'}, 'Bernadette': set()}
    je suis parvenu par une méthode pas optimale à mon sens à régler le cas du TRUE mais pour le FALSE je suis bloqué : je n'arrive pas à accéder aux valeurs concernées pour les supprimer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def modification_dico(d, englobe="True"):
        relation = [(prenom, amis) for prenom, amis in d.items()]
        for prenom, amis_prenom in relation:
            if englobe:
                for prenoma in amis_prenom:
                    d[prenom].add(prenoma)
                    d[prenoma].add(prenom)
            else:
               pass
     
     
        return d
    Merci d'avance pour vos pistes et/ou vos commentaires. Je ne veux pas du tout prêt mais plutôt être aiguillé dans le "bon sens".

    Bonne journée à toutes et à tous.

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    La difficulté ici se résume à ne pas modifier le set sur lequel on itèrera.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    d = {'Thierry': {'Michelle', 'Bernadette'}, 'Michelle': {'Thierry'}, 'Bernadette': set()}
     
    def modification_dico(d, englobe=True):
        if englobe :
            for nom, amis in d.items():
                for ami in amis:
                    d[ami].add(nom)
        else :
            for nom, amis in d.items():
                s = set()
                for ami in amis:
                    if nom not in d[ami]:
                        s.add(ami)
                amis -= s
     
     
    from copy import deepcopy
     
    d1 = deepcopy(d)
    modification_dico(d1)
     
    d2 = deepcopy(d)
    modification_dico(d2, False)
     
    print('base', d)
    print('englobe à true', d1)
    print('englobe à false', d2)
    Maintenant, pour factoriser un peu, on pourrait faire 2 fonctions pour chacune des opération à effectuer sur le dico, et la fonction modification_dico, appelerait une de ces fonctions en fonction de la valeur de englobe.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour

    D'après ce que j'ai compris, dans un sens la fonction complète ce qui manque et dans l'autre sens elle enlève ce qu'il y a en trop.
    Si c'est ça...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def check(d, flag):
    	if flag:
    		for (prenom, amis) in d.items():
    			for ami in amis: d[ami].add(prenom)
    		# for
    	else:
    		for ami in d.keys():
    			for prenom in d.keys():
    				if ami in d[prenom] and prenom not in d[ami]: d[prenom].remove(ami)
    			# for
    		# for
    	# if
    # check()
    Après, si tu gères un peu les listes en intension, tu peux raccourcir le code (surtout pour le cas de suppression qui a une complexité O²)...

    Citation Envoyé par bistouille Voir le message
    La difficulté ici se résume à ne pas modifier le set sur lequel on itèrera.
    Pfff...
    La difficulté ici se résume surtout à clarifier le merdier qu'il y a entre tes oreilles.

    Citation Envoyé par bistouille Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    s = set()
    for ami in amis:
    	if nom not in d[ami]:
    		s.add(ami)
    	amis -= s
    Oui en effet pourquoi faire simple. Attrapper une souris avec un maillet, un arc ou une catapulte, après-tout, ce qui compte c'est le résultat n'est-ce pas ???
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Merci à vous deux !

    je regarde vos propositions et je reviens vers vous...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Re,

    merci pour vos propositions qui fonctionnent. Mais qu'entendez vous par

    Après, si tu gères un peu les listes en intension,...
    Sont-ce les compréhensions de listes ?

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beckhton Voir le message
    Sont-ce les compréhensions de listes ?
    Oui. Les "comprehensions de listes" est un autre nom pour les listes en intension.

    Par exemple la partie "else" peut se réécrire de cette façon
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ami in d.keys():
    	for prenom in (x for x in d.keys() if ami in d[x] and x not in d[ami]): d[prenom].remove(ami)
    # for

    Le code est plus concis mais bien évidemment ça ne change rien à la complexité de l'algo.
    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]

Discussions similaires

  1. Supprimer une valeur $_POST
    Par mello dans le forum Langage
    Réponses: 4
    Dernier message: 20/08/2008, 00h20
  2. supprimer une valeur d'input au focus
    Par doudawak dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2008, 19h25
  3. base de registre supprimer une valeur
    Par cotede2 dans le forum Windows XP
    Réponses: 2
    Dernier message: 27/05/2007, 00h58
  4. Supprimer une valeur dans un vecteur
    Par jalilv6 dans le forum Langage
    Réponses: 2
    Dernier message: 06/04/2006, 09h33
  5. Réponses: 3
    Dernier message: 14/03/2006, 11h34

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