2010-11-05 9 views
-2

Lorsque nous ajoutons des éléments de dictionnaire,Python: ajout d'éléments de dictionnaire.

nous utilisons x.items()+y.items(), mais il y avait quelque chose que je ne comprends pas.

par exemple

si x={2:2,1:3} et y={1:3,3:1}x.items()+y.items() donne {3:1,2:2,1:3}

donc, comme vous pouvez le voir, la réponse pourrait mathématiquement avoir été 6x+2x^2+x^3,

mais le dictionnaire donne x^3+2x^2+3x,

quelqu'un peut-il me dire une meilleure méthode qui fonctionne mieux?

+3

Vous devez expliquer mieux ce que vous attendez à obtenir lorsque vous « ajouter » dictionnaires, et en particulier pourquoi vous attendez pour faire ce que vous pensez qu'il devrait plutôt que ce qu'il fait réellement ... –

+0

Qui êtes-vous (le "nous") et pourquoi utilisez-vous 'x.items() + y.items()' pour "ajouter" deux dictionnaires ? – tzot

Répondre

5

Soyons clairs ce qui se passe ici!

In [7]: x.items() 
Out[7]: [(1, 3), (2, 2)] 

In [8]: y.items() 
Out[8]: [(1, 3), (3, 1)] 

In [9]: x.items() + y.items() 
Out[9]: [(1, 3), (2, 2), (1, 3), (3, 1)] 

In [10]: dict(x.items() + y.items()) 
Out[10]: {1: 3, 2: 2, 3: 1} 

items() produit une liste de (clé, valeur) tuples et + concatène les listes. Vous pouvez ensuite redéfinir cette liste dans un dictionnaire, qui traitera des clés dupliquées en prenant la dernière valeur avec une clé donnée. Comme il est une valeur en double cette fois-ci, il n'a pas d'importance, mais il peut:

In [11]: z = {1:4, 3:1} 

In [12]: dict(x.items() + z.items()) 
Out[12]: {1: 4, 2: 2, 3: 1} 

Dans ce cas, le 1: 3 entrée est mis au rebut ...

(Pas clair que votre analogie avec polynômes est ... Si vous vraiment voulez représenter polynômes qui ajoutent arithmétiquement, vous voudrez peut-être consulter la

1

numpy classe poly1d ou collections.Counter décrit par @adw.) vous pouvez créer votre propre sous-classe de dict pour mettre en œuvre la ajouter un opérateur à d o ce que vous vouliez:

import copy 
class AddingDict(dict): 
    def __add__(self, d2): 
     new_dict = copy.deepcopy(self) 
     for key, value in d2.iteritems(): 
      if key in new_dict: 
       new_dict[key] += value 
      else: 
       new_dict[key] = value 
     return new_dict 

Et maintenant:

>>> x = AddingDict({2:2,1:3}) 
>>> y = AddingDict({1:3,3:1}) 
>>> x+y 
{1: 6, 2: 2, 3: 1} 

Modifier

Si vous avez besoin d'efficacité supplémentaire, vérifier si chaque touche est dans la new_dict pour chaque clé dans l'original est inefficace, et vous pourriez convertir chaque liste de clés à set et prendre l'intersection, mais le code serait plus compliqué et l'efficacité n'est probablement pas nécessaire. La mise en œuvre effective est laissée au lecteur en tant qu'exercice.

2

Lorsque vous appelez dict(x.items()+y.items()), les clés dupliquées sont simplement définies deux fois et la dernière valeur définie (celle de y) remplace l'ancienne (de x).

Puisqu'un dictionnaire Python peut avoir n'importe quoi comme ses clés ou valeurs (tant que les clés sont traitables), comment saurait-il comment combiner l'ancienne et la nouvelle valeur lorsqu'une clé est remplacée?

Dans Python 2.7 et 3, il existe une sous-classe de dictionnaire appelée Counter qui ne peut avoir que des valeurs numériques.Et quand vous ajoutez deux de ces ensemble, il ne ajouter les valeurs ainsi que pour les clés en double:

>>> from collections import Counter 
>>> Counter({2:2,1:3}) + Counter({1:3,3:1}) 
Counter({1: 6, 2: 2, 3: 1})