Vous pouvez le faire comme suit:
for key in list(tupledict):
if len(key) > 1:
tupledict[key] = sum(tupledict.get((subk,),0) for subk in key)
Nous itérer sur la liste des clés (nous utilisons un list(..)
tel que nous ne mettons pas à jour une collection que nous sommes actuellement itérer sur
Dans. le cas len(key)
est supérieur à 1, on calcule la somme des sous-clés, et attribuons cette valeur à la tupledict
Ceci construit le dictionnaire suivant:.
>>> tupledict = {('A','B','C'):2, ('A',): 3, ('B',) :4, ('C',): 5}
>>> for key in list(tupledict):
... if len(key) > 1:
... tupledict[key] = sum(tupledict.get((subk,),0) for subk in key)
...
>>> tupledict
{('A',): 3, ('B',): 4, ('C',): 5, ('A', 'B', 'C'): 12}
Alternativement, vous pouvez sous-classe le dictionnaire et remplacer la __getitem__
telle que si on demande un tuple avec une longueur supérieure à 1, il ajoute les éléments ensemble. Dans ce cas, nous allons économiser sur la mémoire (et ne pas avoir à jour tous les tuples) depuis les tuples ('A','B','C')
sont stockés implicitement:
class SumDict(dict):
def __getitem__(self, key):
if len(key) > 1:
return sum(self.get((subk,) ,0) for subk in key)
else:
return super().__getitem__(key)
Par exemple:
>>> tupledict = {('A',): 3, ('B',) :4, ('C',): 5}
>>> sd = SumDict(tupledict)
>>> sd[('A','B','C')]
12
>>> sd[('A','B')]
7
Au moment où vous devez recourir à l'itération sur un dictionnaire, vous savez que vous vous trompez. –