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 :

Besoin d'aide exercice Python [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2022
    Messages : 2
    Par défaut Besoin d'aide exercice Python
    Bonjour,
    J'aide du mal avec cet exercice, quelqu'un pourrait m'aider svp ?

    Écrire une fonction jointure(bdd1,champ1,bdd2,champ2) qui renvoie une nouvelle base. Pour que cela soit
    possible, il faut qu’aucun champs de bdd1 ne soit aussi un champ de bdd2. La nouvelle base est construite

    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
    ainsi :
    bdd1 =
    [{'int': 1, 'str': 'a'},
    {'int': 2, 'str': 'a'},
    {'int': 3, 'str': 'b'}
    {'int': 4, 'str': 'c']
     
    bdd2 =
    [{'string': 'a', 'float': 3.14},
    {'string': 'b', 'float': 2.72},
    {'string': 'b', 'float': 1.41}]
     
    jointure(bdd1,"str",bdd2,"string")
    >>>>[{'int': 1, 'str': 'a', 'float': 3.14},
    {'int': 2, 'str': 'a', 'float': 3.14},
    {'int': 3, 'str': 'b', 'float': 2.72},
    {'int': 3, 'str': 'b', 'float': 1.41}]

  2. #2
    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 johnllol Voir le message
    J'aide du mal avec cet exercice, quelqu'un pourrait m'aider svp ?
    Oui on est là pour ça. Mais la condition préalable à toute aide est que tu commences par montrer ce que tu as fait.

    Si tu as du mal à commencer (ça peut arriver), commence par traiter chaque info de bdd1 et voir comment tu peux ensuite t'en servir pour en extraire le champ qui sert de jointure sur la bdd2...
    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]

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2022
    Messages : 2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Oui on est là pour ça. Mais la condition préalable à toute aide est que tu commences par montrer ce que tu as fait.

    Si tu as du mal à commencer (ça peut arriver), commence par traiter chaque info de bdd1 et voir comment tu peux ensuite t'en servir pour en extraire le champ qui sert de jointure sur la bdd2...

    Re, j'ai commencé avec ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def jointure(bdd1, champ1, bdd2, champ2):
        final_bdd = []
     
        # Pour chaque champ de bdd1
        for bdd1_index, bdd1_element in enumerate(bdd1):
            for bdd2_index, bdd2_element in enumerate(bdd2):
                to_append = {}
                # Si un champ similaire existe dans bdd2
                if bdd1[bdd1_index][champ1] == bdd2[bdd2_index][champ2]:
                    to_append = bdd1[bdd1_index]
                    to_append[str(list(bdd2_element)[1:][0])] = [value for key, value in bdd2[bdd2_index].items() if key not in champ2][0]
                    final_bdd.append(to_append)
     
        return final_bdd
    Le problème étant que lorsqu'une valeur de bdd1 a été trouvé dans bdd2 et ajouté à final_bdd, on continue avec la valeur de bdd1 et donc on assigne la dernière valeur de bdd2 trouvé, ce qui écrase la précédente (supposition):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{'int': 1, 'str': 'a', 'float': 3.14}, {'int': 2, 'str': 'a', 'float': 3.14}, {'int': 3, 'str': 'b', 'float': 1.41}, {'int': 3, 'str': 'b', 'float': 1.41}]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Tu n'étais pas loin ! Il ne faut JAMAIS oublié que les listes ou les dictionnaires doivent être dupliqués correctement, si on s'y prend mal voici ce que ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> dico1 = {'int': 1, 'str': 'a'}
     
    >>> dico = dico1
     
    >>> dico['toto']=0+0
     
    >>> dico
    {'int': 1, 'str': 'a', 'toto': 0}
     
    >>> dico1
    {'int': 1, 'str': 'a', 'toto': 0}
    Il existe tout un tas de méthode pour cloner une liste, le plus simple est souvent d'utiliser le module copy avec la fonction deepcopy (pour dupliquer des listes imbriquées dans des listes...). Voici un site qui référence toutes (ou presque) les méthodes de clonage de liste : https://therenegadecoder.com/code/ho...multiplication

    Ici il suffit d'utiliser la fonction copy() des dictionnaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def test():
    	bdd = []
    	for dico1 in bdd1:
    		for dico2 in bdd2:
    			if dico2['string']==dico1['str']:
    				dico = dico1.copy()
    				dico['float']=dico2['float']
    				bdd.append(dico)
    	return bdd
    J'espère ne pas me tromper...

  5. #5
    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 johnllol Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{'int': 1, 'str': 'a', 'float': 3.14}, {'int': 2, 'str': 'a', 'float': 3.14}, {'int': 3, 'str': 'b', 'float': 1.41}, {'int': 3, 'str': 'b', 'float': 1.41}]
    En tout cas, par rapport à l'exemple que tu as montré au premier post, ton code fournit un résultat identique...

    Citation Envoyé par LeNarvalo Voir le message
    J'espère ne pas me tromper...
    Dans l'absolu non, ce que tu dis est vrai (sauf à conseiller systématiquement de passer par le module "copy" en disant que c'est "le plus simple" car le plus simple est plutôt de ne pas utiliser un module quand ce n'est pas nécessaire)
    Mais dans le cas présent je n'ai pas trouvé d'exemple où ce danger inhérent à la copie superficielle amène un résultat erroné...
    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]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Okay !

    J'utilise quasiment jamais le module copy qui plus est ^^'. Je me suis dit que deepcopy était plus facile, pas besoin de comprendre.



    Je me permets un petit squattage de topic pour pas changer, si t'as envie d'y répondre Sve@r :

    1. deepcopy fonctionne de façon récursive ? C'est pas terrible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def t():
    	l = []
    	for i in range(300):
    		m = [l]
    		l = [m]
    	x = copy.deepcopy(l)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RecursionError: maximum recursion depth exceeded while calling a Python object
    2. La méthode la plus commune où tu utilises une boucle et une pile faite maison, elle porte un nom ? (Alzheimer ...)

    3. Je te mets au défi de faire une fonction de copie profonde sans récursion et sans Google ! (Chui toujours une quiche ! Que se soit pour résoudre un labyrinthe ou faire ça, mon cerveau sature...)

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

Discussions similaires

  1. Besoin d'aide sur python, exercices sur les fichiers
    Par Mini-minimoys dans le forum Général Python
    Réponses: 6
    Dernier message: 21/11/2015, 18h37
  2. aide exercice python
    Par brunette83 dans le forum Général Python
    Réponses: 10
    Dernier message: 21/11/2012, 08h36
  3. aide exercice python
    Par cedric190985 dans le forum Général Python
    Réponses: 2
    Dernier message: 24/03/2010, 12h57

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