2016-01-19 1 views
1

J'ai essayé de définir quelques objets OrderedDict tout l'après-midi, mais en recevant le message ValueError.Erreur lors de la définition d'un OrderedDict - ValueError: trop de valeurs pour décompresser

from collections import OrderedDict 

personA = OrderedDict([(u'score', 
        OrderedDict([ (u'2015-09-09 03:40:33 +0100', 2646), 
            (u'2015-09-10 03:35:34 +0100', 2646), 
           ]), 
     OrderedDict([(u'adjusted_score', 
        OrderedDict([ (u'2015-09-09 03:40:33 +0100', 3646), 
            (u'2015-09-10 03:35:34 +0100', 3646), 
           ]) 
        )]) 
    )]) 

personB = OrderedDict([(u'score', 
        OrderedDict([ (u'2015-09-11 03:40:33 +0100', 4646), 
            (u'2015-09-12 03:35:34 +0100', 4646), 
           ]), 
     OrderedDict([(u'adjusted_score', 
        OrderedDict([ (u'2015-09-11 03:40:33 +0100', 5646), 
            (u'2015-09-12 03:35:34 +0100', 5646), 
           ]), 
        )]) 
    )]) 

L'exécution de ce retour:

$ python ordereddict.py 
Traceback (most recent call last): 
    File "ordereddict.py", line 23, in <module> 
    (u'2015-09-10 03:35:34 +0100', 3646), 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 52, in __init__ 
    self.__update(*args, **kwds) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py", line 547, in update 
    for key, value in other: 
ValueError: too many values to unpack 

L'objectif final est d'essayer de fusionner ces deux objets imbriqués, mais maintenant je suis perplexe sur même les définir!

Répondre

3

Lors de l'utilisation d'une entrée list-OrderedDict, il devrait être de la forme d'un association list, comme [(key1, val1), (key2, val2), ...].

Considérons simplement personA. Pour ce OrderedDict, vous commencez correctement avec le list ayant u'score' comme une clé et

OrderedDict([(u'2015-09-09 03:40:33 +0100', 2646), 
      (u'2015-09-10 03:35:34 +0100', 2646), 
      ]) 

comme valeur.

Notez toutefois que vous ne donnez pas les parenthèses fermantes après cette valeur. Au lieu de cela, vous donnez simplement une virgule, puis commencez à définir quelle sera l'entrée de valeur-clé suivante dans la liste des constructeurs.

Le premier problème est que vous avez besoin d'un ) supplémentaire juste après la fin de la première paire valeur/clé, pour en faire un 2-tuple.

Ensuite, lorsque vous démarrez avec la deuxième paire valeur/clé, vous commencez avec un nouveau OrderedDict, mais ce n'est pas ce que vous voulez. Ce que vous voulez, c'est que u'adjusted_score' soit une clé, à l'intérieur d'un tuple de valeur-clé à 2 éléments. Faire cette modification vous permet également de vous débarrasser d'un ensemble redondant des délimiteurs de fermeture.

Donc dans l'ensemble, il sera:

In [10]: personA = OrderedDict([ 
      (u'score', 
       OrderedDict([(u'2015-09-09 03:40:33 +0100', 2646), 
          (u'2015-09-10 03:35:34 +0100', 2646), 
          ]) 
      ), # <-- this was missing for 2-tuple 

      (u'adjusted_score', 
       OrderedDict([(u'2015-09-09 03:40:33 +0100', 3646), 
          (u'2015-09-10 03:35:34 +0100', 3646), 
          ]) 
      ) 
     ] # <-- Closes the list passed in the constructor 
) # <-- Closes the open parenthesis from the "OrderedDict(" constructor. 

In [11]: personA 
Out[11]: OrderedDict([(u'score', OrderedDict([(u'2015-09-09 03:40:33 +0100', 2646), (u'2015-09-10 03:35:34 +0100', 2646)])), (u'adjusted_score', OrderedDict([(u'2015-09-09 03:40:33 +0100', 3646), (u'2015-09-10 03:35:34 +0100', 3646)]))]) 

Le message d'erreur particulière que vous voyez est dû au fait que dans votre code d'origine, l'tuple générale à l'intérieur du list passé au constructeur OrderedDict a plus de seulement 2 éléments, et la logique constructeur interne de OrderedDict ne sait pas comment gérer une "liste d'associations" en entrée lorsque les "associations" dans la liste ont plus que les deux éléments attendus (la clé et la valeur).

+0

Explication claire, merci – user2761030

1

Les OrderedDict ne reçoivent pas de liste de paires. Vous passez 3-tuples. Essayez

from collections import OrderedDict 

personA = OrderedDict([ 
      (u'score', 
      OrderedDict([ (u'2015-09-09 03:40:33 +0100', 2646), 
         (u'2015-09-10 03:35:34 +0100', 2646), 
         ])), 
      (u'adjusted_score', 
      OrderedDict([ (u'2015-09-09 03:40:33 +0100', 3646), 
          (u'2015-09-10 03:35:34 +0100', 3646), 
         ])) 
      ]) 

personB = OrderedDict([ 
      (u'score', 
      OrderedDict([ (u'2015-09-11 03:40:33 +0100', 4646), 
          (u'2015-09-12 03:35:34 +0100', 4646), 
         ])), 
      (u'adjusted_score', 
      OrderedDict([ (u'2015-09-11 03:40:33 +0100', 5646), 
          (u'2015-09-12 03:35:34 +0100', 5646), 
         ])), 
      ])