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 :

Ajouter une valeur à un dictionnaire


Sujet :

Python

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut Ajouter une valeur à un dictionnaire
    Bonjour j'ai un petit problème concernant les dictionnaires

    Comment fait_on pour ajouter une valeur à un dictionnaire sans écraser la valeur??????
    append ne fonctionne pas, avez vous une idée?





    merci pour l'aide

  2. #2
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Peux-tu poster un exemple de ce qui te pose problème ?

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,



    append à quoi ? On ne fait append que sur une liste. Si la valeur référencée par une clé n’est pas une liste, on ne peut pas faire append.

    Si tu veux qu’une clé référence une valeur supplémentaire sans perdre la valeur qu’elle référençait déjà, il faut remplacer la valeur initiale par un conteneur.

    Ce qui suit répond-il à ton problème ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d = {1:'abc',12:'nono',33:'barique'}
    print d
     
    d[12] = (d[12],'maree')
    print d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {1: 'abc', 12: 'nono', 33: 'barique'}
    {1: 'abc', 12: ('nono', 'maree'), 33: 'barique'}

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    désolé je me suis mal exprimé
    voilà un exemple :

    {'Mai_Sud_2010': 43}

    comment peut on obtenir {'Mai_Sud_2010': 43,60}?

    merci pour l'aide

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    peut être que l'on peut contourner mon problème

    est il possible entre deux dates :

    date : [datetime.datetime(2010, 2, 2, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)]
    il y a 94 jours

    est il possible d'avoir ces 94 jours par nombre de jours dans le mois soit en réponse :

    28 ,31 ,30 et 5 qui correspond à 28 jours en février, 31 jours en mars, 30 jours en avril et 5 jours en mai?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par niepoc Voir le message
    désolé je me suis mal exprimé
    voilà un exemple :

    {'Mai_Sud_2010': 43}

    comment peut on obtenir {'Mai_Sud_2010': 43,60}?

    merci pour l'aide
    Ton exemple fait penser que tes valeurs de dictionnaire sont des strings.

    Dans ce cas ce que tu peux faire c'est récupérer ta valeur initiale, créer un nouveau string qui contiendra la nouvelle et l'ancienne valeur, écraser l'ancienne valeur du dictionaire pour la recrée avec le nouveau string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    oldVal = dic['Mai_Sud_2010']
    newVal = 60
    temp = oldVal + "," + str(newVal)
    dic['Mai_Sud_2010'] = temp
    Tu pourrais faire pareil avec une liste.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    comment peut on obtenir {'Mai_Sud_2010': 43,60}?
    On ne peut pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d = {'Mai_Sud_2010': 43,60}
    print d
    => There's an error in your programm: invalid syntax






    est il possible d'avoir ces 94 jours par nombre de jours dans le mois ?
    Oui mais il n'y a pas à ma connaissance de manière simple de faire en utilisant des méthodes prédéfinies. Il faut faire un programme un peu conséquent. je ne suis pas arrivé à faire plus court que ce qui suit:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    njmois = dict(zip((1,3,4,5,6,7,8,9,10,11,12),
                      (31,31,30,31,30,31,31,30,31,30,31)))
     
    import datetime
    from calendar import isleap
     
     
    def jours_par_mois(couple):
        a,b = couple
     
        if (a.year,a.month)==(b.year,b.month):
            return [b.day-a.day]
        else:
            if a.month==2:
                li = [ 29 + isleap(a.year) - a.day ]
            else:
                li = [ njmois[a.month] - a.day + 1 ]
     
            y, m = a.year, a.month+1
            while (y,m)!=(b.year,b.month): 
                if m==2:
                    li.append( 28 + isleap(y) )
                else:
                    li.append( njmois[m] )
                m += 1
                if m==13:  y, m = y+1, 1         
     
            if b.day>1:  li.append(b.day-1)
     
            return li
     
     
    d = {'date' : [datetime.datetime(2010, 2, 2, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)] }
    print jours_par_mois(d['date'])
    print
    print jours_par_mois([datetime.datetime(2008, 1, 23, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois([datetime.datetime(2008, 2, 4, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])

    isleap(y) est True si l'année est bisextile et False sinon.

    Mon code tient compte si un mois de février est bisextile ou non, et si la période envisagée s'étend de part et d'autre d'un 1er janvier

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Mon code n’est pas bon, le programme plante quand la première date est un jour de décembre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print jours_par_mois([datetime.datetime(2008, 12, 22, 0, 0), datetime.datetime(2009, 5, 6, 12, 0)])
    => KeyError: 13

    C’est parce que je fais commencer l’itération des mois successifs en commençant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y, m = a.year, a.month+1
    sans vérifier que a.month est différent de 12.



    Correction de ce bug:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    njmois = dict(zip((1,3,4,5,6,7,8,9,10,11),
                      (31,31,30,31,30,31,31,30,31,30)))
     
    import datetime
    from calendar import isleap
     
     
    def jours_par_mois(couple):
        a,b = couple
        y, m, li = a.year, a.month, []
     
        if (y,m)==(b.year,b.month):
            return [b.day-a.day]
     
        while (y,m)!=(b.year,b.month):                
            if m==2:
                li.append( 28 + isleap(y) ) # fevrier
                m += 1
            elif m==12:
                li.append( 31 )
                y, m = y+1, 1 # de decembre a janvier de l'annee suivante
            else:
                li.append( njmois[m] )
                m += 1
     
        li[0] = li[0] - a.day + 1
        if b.day>1:  li.append(b.day-1)
     
        return li
     
     
    d = {'date' : [datetime.datetime(2010, 2, 2, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)] }
    print jours_par_mois(d['date'])
    print
    print jours_par_mois([datetime.datetime(2008, 1, 23, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois([datetime.datetime(2008, 2, 4, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois([datetime.datetime(2007, 12, 22, 0, 0), datetime.datetime(2009, 1, 22, 12, 0)])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [27, 31, 30, 5]
     
    [9, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 5]
     
    [26, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 5]
     
    [10, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 21]

  9. #9
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut fignolage
    Pas besoin de dictionnaire des nombres de jours.
    Emploi de m = m%12 + 1.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import datetime
    from calendar import isleap
     
    def jours_par_mois(couple):
        a,b = couple
        y, m, li = a.year, a.month, []
     
        if (y,m)==(b.year,b.month):
            return [b.day-a.day]
     
        while (y,m)!=(b.year,b.month):       
            if m in (1,3,5,7,8,10,12): # mois longs
                li.append( 31 )
                m = m%12 + 1
                if m==1:  y = y+1
            elif m==2: # fevrier
                li.append( 28 + isleap(y) )
                m = 3
            else:      # autres mois courts
                li.append( 30 )
                m += 1
     
        li[0] = li[0] - a.day + 1
        if b.day>1:  li.append(b.day-1)
     
        return li
     
     
    d = {'date' : [datetime.datetime(2010, 2, 2, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)] }
    print jours_par_mois(d['date'])
    print
    print jours_par_mois([datetime.datetime(2008, 1, 23, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois([datetime.datetime(2008, 2, 4, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois([datetime.datetime(2007, 12, 22, 0, 0), datetime.datetime(2009, 1, 22, 12, 0)])
    print
    print jours_par_mois([datetime.datetime(2007, 9, 30, 0, 0), datetime.datetime(2007, 10, 1, 12, 0)])

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    La boucle while avec tous ces cas différents et le problème du passage d’une année à l’autre me chiffonait quelque part.

    Maintenant je suis plus satisfait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import datetime
    from calendar import isleap
     
    def jours_par_mois(couple):
     
        if (a.year,a.month)==(b.year,b.month):  return [b.day-a.day]
     
        seq = ( [31,28+isleap(y),31,30,31,30,31,31,30,31,30,31] for y in xrange(a.year,b.year+1) )
        seq = sum(seq,[])[a.month-1:b.month-13]
        seq[0] += -a.day + 1
        if b.day>1:  seq.append(b.day-1)
        return seq
    Le code de la fonction est passé de 18 lignes à 6.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    d = {'date' : [datetime.datetime(2010, 2, 2, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)] }
    print jours_par_mois(*d['date'])
    print
    print jours_par_mois(*[datetime.datetime(2008, 1, 23, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois(*[datetime.datetime(2008, 2, 4, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)])
    print
    print jours_par_mois(*[datetime.datetime(2007, 12, 22, 0, 0), datetime.datetime(2009, 1, 22, 12, 0)])
    print
    print jours_par_mois(*[datetime.datetime(2007, 9, 30, 0, 0), datetime.datetime(2007, 10, 1, 12, 0)])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [27, 31, 30, 5]
     
    [9, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 5]
     
    [26, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 5]
     
    [10, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 21]
     
    [1]

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Points : 34
    Points
    34
    Par défaut
    bonjours

    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
     
    a = {'Mai_Sud_2010': 43}
     
    def ajout(d1,d2):
        for k,v in d1.items():
            if d2.has_key(k):
                if isinstance(d1[k],dict) and isinstance(d2[k],dict):
                    ajout(d1[k],d2[k])
                    for k2 in d2[k].keys():
                        if k2 not in d1[k]:
                            d1[k][k2] = d2[k][k2]
                else :
                    if isinstance(d1[k],list):
                        d1[k] = d1[k]+[d2[k]]
                    else:
                        d1[k] = [d1[k]]+[d2[k]]
            else:
                for k,v in d2.items():
                    if not d1.has_key(k):
                        d1[k] = v
     
     
    ajout(a,{'Mai_Sud_2010': 60})
    ajout(a,{'Mai_Sud_2010': 31})
    print a

Discussions similaires

  1. ajouter une valeur supplementaire à une session
    Par carmen256 dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2006, 14h53
  2. Ajouter une valeur dans un listview
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/01/2006, 22h15
  3. VBA : ajouter une valeur dans une liste déroulante
    Par remi59 dans le forum Access
    Réponses: 4
    Dernier message: 22/12/2005, 10h01
  4. ajouter une valeur dans une combobox
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 10h58
  5. Popup ajoutant une valeur a un champ
    Par kalan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/09/2005, 15h39

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