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 :

[Dictionnaire][multivaleur] Incrémenter plusieurs valeurs dans un dictionnaire


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 1
    Points : 0
    Points
    0
    Par défaut [Dictionnaire][multivaleur] Incrémenter plusieurs valeurs dans un dictionnaire
    Bonjour,

    J'ai un fichier de données constitué de 2 colonnes :
    C1 C2
    A T1
    A T1
    B T2
    B T3
    C T3
    D T1
    je voudrais obtenir la sortie suivante :
    A : T1
    B : T2, T3
    C : T3
    D : T1

    J'ai essayé avec un dictionnaire dic[C1]=[C2] mais cela ne permet pas plusieurs par clefs.
    Je sais qu'il existe une manière d'introduire la fonction .append mais je ne sais pas le faire.

    Merci de votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par jk3531 Voir le message
    J'ai essayé avec un dictionnaire dic[C1]=[C2] mais cela ne permet pas plusieurs par clefs.
    Bonsoir,
    Peut-être qu'un bout de code donnerait envie aux lecteurs de répondre, non?

    Sinon, il est possible de tester l'existence d'une clef dans un dictionnaire:
    if nv_clef in dic.keys():
    Si le code suivant le "if" est exécuté, c'est que le dictionnaire possède cette clef…

    Clodion

    PS: oui, il faut traiter le fichier ligne par ligne (d'une manière ou d'une autre) et ajouter les clefs une à une.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    la méthode dict.get() est bien pour ce que tu veux faire.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par jk3531 Voir le message
    J'ai essayé avec un dictionnaire dic[C1]=[C2] mais cela ne permet pas plusieurs par clefs.
    Je sais qu'il existe une manière d'introduire la fonction .append mais je ne sais pas le faire.
    La méthode append permet de rajouter des éléments à un tableau déjà existant. Donc
    1. tu crées le tableau vide au début dans chaque clef de ton dico
    2. pour chaque élément à rajouter tu fais un append


    Ce qui donnerait un truc du genre:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dic={
    	"A" : [],
    	"B" : [],
    	"C" : [],
    	"D" : [],
    }
     
    for (k, v) in colonnes_de_mon_fichier:
    	dic[k].append(v)

    Ou alors
    1. tu crées le dico vide
    2. pour chaque élément à rajouter, si la clef n'existe pas tu la crées sinon tu fais un append


    Ce qui donnerait un truc du genre:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dic={}
     
    for (k, v) in colonnes_de_mon_fichier:
    	if k not in dic.iterkeys(): dic[k]=[v]
    	else: dic[k].append(v)
    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]

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ce qui donnerait un truc du genre:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dic={}
     
    for (k, v) in colonnes_de_mon_fichier:
    	if k not in dic.iterkeys(): dic[k]=[v]
    	else: dic[k].append(v)
    une variante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_dic = {}
     
    for cle,valeur in ma_liste:
        mon_dic[cle] = mon_dic.get(cle,[])+[valeur]

  6. #6
    Membre régulier
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Points : 94
    Points
    94
    Par défaut
    Comme ce dictionnaire doit créer par défaut une liste lorsqu'on crée une nouvelle clé, il est opportun d'utiliser defaultdict du module collections.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from collections import defaultdict
     
    data = defaultdict(list)
    with open("mon_fichier.txt", "r") as f:
        content = read(f)
        for line in content.splitlines():
            k, v = line.split(" ")
            data[k] = v

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dan737 Voir le message
    il est opportun d'utiliser...
    Pourquoi ? Puisque la création de la liste se fait dans le code, a-t-on vraiment besoin de ce module ?
    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]

  8. #8
    Membre régulier
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Points : 94
    Points
    94
    Par défaut
    Ce module fait partie de la librairie standard.

    Citation Envoyé par Sve@r Voir le message
    Ou alors
    1. tu crées le dico vide
    2. pour chaque élément à rajouter, si la clef n'existe pas tu la crées sinon tu fais un append
    Le comportement de defaultdict est justement de créer une nouvelle liste vide lorsqu'on ajoute une nouvelle clé, ou d'ajouter la valeur à la liste existante si la clé existe déjà. Bien entendu ça peut très bien être ré-écrit. Mais pourquoi ré-inventer la roue?

    A mes yeux ça rendra le code plus propre, plus simple et facile à maintenir. On évite d'éventuels bugs. Mais bon ce n'est qu'un avis. Chacun fait comme il l'entend...

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Juste pour y mettre mon grain de sel:

    Citation Envoyé par Dan737 Voir le message
    Comme ce dictionnaire doit créer par défaut une liste lorsqu'on crée une nouvelle clé, il est opportun d'utiliser defaultdict du module collections.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from collections import defaultdict
     
    data = defaultdict(list)
    with open("mon_fichier.txt", "r") as f:
        content = read(f)
        for line in content.splitlines():
            k, v = line.split(" ")
            data[k] = v
    En écrivant "data[k] = v", çà écrase l'initialisation associée à la clé... oops.
    De toutes façons, en relisant la prose du PO, il semble qu'il ne souhaite pas de valeurs dupliquées, ce qui conduit à écrire plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if v not in data[k]:
            data[k].append(v)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    je reposte le bout de code que j'ai mis plus haut car il me semble que personne ne l'a vu ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_dic = {}
     
    for cle,valeur in ma_liste:
        mon_dic[cle] = mon_dic.get(cle,[])+[valeur]
    ... et qui a normalement le comportement attendu sans import.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par josmiley Voir le message
    je reposte le bout de code que j'ai mis plus haut car il me semble que personne ne l'a vu ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_dic = {}
     
    for cle,valeur in ma_liste:
        mon_dic[cle] = mon_dic.get(cle,[])+[valeur]
    ... et qui a normalement le comportement attendu sans import.
    c'est un peu verbeux plus simple serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_dic = {}
     
    for cle,valeur in ma_liste:
        mon_dic.setdefault(k, []).append(valeur)
    notes: essayez de remplacer .setdefault par .get pour voir la différence. dans tous les cas çà ne déduplique pas. on pourrait écrire (dans ce cas) mon_dic.setdefault(k, set()).add(valeur)

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

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    bien vu !

  13. #13
    Membre régulier
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    En écrivant "data[k] = v", çà écrase l'initialisation associée à la clé... oops.
    De toutes façons, en relisant la prose du PO, il semble qu'il ne souhaite pas de valeurs dupliquées, ce qui conduit à écrire plutôt:
    Oops en effet C'était bien un append que je voulais dire. Et s'il ne veut que des valeurs uniques, alors on peut prendre un defaultdict de set (sauf évidemment si l'ordre des valeurs a une importance).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from collections import defaultdict
     
    data = defaultdict(set)
    with open("mon_fichier.txt", "r") as f:
        content = read(f)
        for line in content.splitlines():
            k, v = line.split(" ")
            data[k].add(v)

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dan737 Voir le message
    Bien entendu ça peut très bien être ré-écrit. Mais pourquoi ré-inventer la roue?
    Ben c'est en fait un peu le problème dans Python: il y a des quantités de roues déjà existantes et donc ce n'est pas facile, quand on a un truc à faire, de savoir qu'il existe la roue déjà toute faite pour ce truc. Et même quand on le sait, d'avoir le réflexe de se dire "ok, là c'est cette roue qu'il me faut"...
    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. Réponses: 0
    Dernier message: 26/05/2014, 12h23
  2. Réponses: 6
    Dernier message: 02/01/2012, 16h05
  3. Récupérer une clé dans un dictionnaire à partir d'une valeur.
    Par alaninho dans le forum Général Python
    Réponses: 3
    Dernier message: 05/05/2011, 10h13
  4. Réponses: 4
    Dernier message: 19/05/2006, 10h26
  5. Plusieurs valeurs dans un value
    Par nebule dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/11/2004, 10h58

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