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
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
Peux-tu poster un exemple de ce qui te pose problème ?
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'}
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
peut être que l'on peut contourner mon problème
est il possible entre deux dates :
il y a 94 joursdate : [datetime.datetime(2010, 2, 2, 0, 0), datetime.datetime(2010, 5, 6, 12, 0)]
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?
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.
Tu pourrais faire pareil avec une liste.
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
On ne peut pas:comment peut on obtenir {'Mai_Sud_2010': 43,60}?
=> There's an error in your programm: invalid syntax
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 d = {'Mai_Sud_2010': 43,60} print d
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:est il possible d'avoir ces 94 jours par nombre de jours dans le mois ?
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
Mon code n’est pas bon, le programme plante quand la première date est un jour de décembre:
=> KeyError: 13
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)])
C’est parce que je fais commencer l’itération des mois successifs en commençant par
sans vérifier que a.month est différent de 12.
Code : Sélectionner tout - Visualiser dans une fenêtre à part y, m = a.year, a.month+1
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]
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)])
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:
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
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
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]
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager