Error defining an OrderedDict - ValueError: too many values to unpack

Error defining an OrderedDict - ValueError: too many values to unpack

我整个下午都在尝试定义几个 OrderedDict 对象,但收到 ValueError 消息。

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), 
                                ]),
                    )])
      )])

运行 这个 returns:

$ 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 

最终目标是尝试合并这两个嵌套对象,但现在我什至无法定义它们!

当使用 list 输入到 OrderedDict 时,它应该是 association list 的形式,例如 [(key1, val1), (key2, val2), ...].

让我们考虑一下 personA。对于这个 OrderedDict,您可以正确地从 listu'score' 作为键和

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

作为值。

但请注意,您没有在该值后加上右括​​号。相反,您只给出一个逗号,然后从构造函数列表中的下一个 key-value 条目开始。

所以第一个问题是您需要在第一个 key-value 对结束后添加一个额外的 ),使它成为一个 2 元组。

接下来,当您从第二对 key-value 开始时,您会从全新的 OrderedDict 开始,但这不是您想要的。你想要的是 u'adjusted_score' 成为 2 元素 key-value 元组内的键。进行此更改还可以让您摆脱一组冗余的结束定界符。

总的来说是:

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)]))])

您看到的特定错误消息是由于在您的原始代码中,传递给 OrderedDict 构造函数的 list 内部的整体 tuple 超过只有 2 个元素,并且 OrderedDict 的内部构造函数逻辑不知道如何处理 "association list" 作为输入,当列表中的 "associations" 不仅仅是预期的两个元素(关键和价值)。

外面的 OrderedDict 没有给出配对列表。您正在传递 3 元组。尝试

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), 
                         ])),
             ])