Sujet : Re: Mon code est lourd
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.pythonDate : 05. May 2022, 22:26:20
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87zgjvvi8j.fsf@universite-de-strasbourg.fr.invalid>
References : 1
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
yves <
yves@free.invalid> writes:
('02', 'D', '27') ('02', 'L', '28') ('03', 'M', '01') ('03', 'M', '02')
Je voudrais arriver à imprimer:
02
D 27
L 28
03
M 01
M 02
>
def g():
yield('02', 'D', '27')
yield('02', 'L', '28')
yield('03', 'M', '01')
yield('03', 'M', '02')
>
>
dic = {}
l02,l03 = [],[]
for elt in g():
m , d, nd = elt
if m == "02":
l02.append((d,nd))
dic['02'] = l02
elif m == "03":
l03.append((d,nd))
dic['03'] = l03
>
pprint(dic)
Vous auriez des suggestions d'écriture plus élégante ?
Note qu'il est inutile de garder tes listes "en double", mais qu'il
faut alors tester leur présence dans le dictionnaire :
for elt in g():
m , d, nd = elt
if m not in dic:
dic[m] = []
dic[m].append ((d,nd))
C'est à peu près exactement ce que fait la méthode setdefault() de dict,
donc on peut raccourcir :
for m, d, nd in g():
dic.setdefault (m, []).append ((d,nd))
Note qu'on s'épargne aussi la variable "elt", puisqu'on peut
destructurer directement dans le "for".
Si ça ne te gène pas d'avoir des listes au lieu des paires, on peut
faire encore un peu plus court :
for m, *r in g():
dic.setdefault (m, []).append (r)
Cela dit, puisqu'il y a douze mois, et que j'imagine que tu auras des
dates dans chaque mois, autant créer d'emblée les listes vides, ce qui
épargne de répéter le test pour chaque date :
dic = { "{:02d}".format (i+1) : [] for i in range (12) }
for m,*r in g():
dic[m].append (r)
(Au passage : pourquoi utiliser des chaînes de caractères pour les mois ?
Un entier serait plus simple à manipuler.)
-- Alain.