2017-09-14 1 views
1

j'ai un dictionnaire de tuples comme suit:Python tuples plus le dictionnaire

tupledict = {('A','B','C'):2, ('A',): 3, ('B',) :4, ('C',): 5} 

Actuellement, le premier tuple est 2, mais je veux lire les valeurs des tuples individuelles pour me donner la somme de 12 correcte .

donc sortie doit être:

tupledict = {('A','B','C'):12, ('A',): 3, ('B',) :4, ('C',): 5} 

Comment cela pourrait-il être fait?

+0

Au moment où vous devez recourir à l'itération sur un dictionnaire, vous savez que vous vous trompez. –

Répondre

3

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 
+0

pourrait être plus sûr d'utiliser 'tupledict.get ((subk,), 0)' en cas d'éléments manquants? – asongtoruin

+0

@asongtoruin: excellente suggestion. Modifié :). –

+0

Vous pourriez envisager de sublimer dict et ut ce code dans la méthode '__missing__' pour quelque chose de vraiment cool – jsbueno

4

Vous pouvez utiliser un dictionnaire la compréhension de construire une nouvelle dict:

>>> tupledict = {('A','B','C'): 2, ('A',): 3, ('B',): 4, ('C',): 5} 
>>> {t: sum(tupledict.get((x,), 0) for x in t) for t in tupledict} 
{('A', 'B', 'C'): 12, ('A',): 3, ('B',): 4, ('C',): 5} 

aide tupledict.get() au lieu de poignées indexation le cas lorsque certains 1-tuple est manquant.