定义OrderedDict时出错 - ValueError:解压缩的值太多

时间:2016-01-19 17:00:15

标签: python python-2.7 ordereddictionary

我一直在尝试整个下午定义几个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), 
                                ]),
                    )])
      )])

运行此命令返回:

$ 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 

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

2 个答案:

答案 0 :(得分:4)

对[{1}}使用list输入时,预计其形式为association list,例如OrderedDict

我们只考虑[(key1, val1), (key2, val2), ...]。对于此personA,您可以使用OrderedDict作为关键字{/ 1}}正确开始,

list

作为价值。

但请注意,您不会在该值之后给出右括号。相反,您只给出一个逗号,然后开始构造函数列表中的下一个键值条目。

所以第一个问题是在第一个键值对结束后需要额外的u'score'才能使它成为2元组。

接下来,当你从第二个键值对开始时,你开始使用全新的OrderedDict([(u'2015-09-09 03:40:33 +0100', 2646), (u'2015-09-10 03:35:34 +0100', 2646), ]) ,但这不是你想要的。你想要的是)是一个关键的,在一个2元素的键值元组中。进行此更改还可以让您摆脱一组冗余的结束分隔符。

总的来说,它将是:

OrderedDict

您看到的特定错误消息是由于在原始代码中,传递给u'adjusted_score'构造函数的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)]))]) 内部的tuple总体上只有2个当列表中的“关联”不仅仅包含预期的两个元素(键和值)时,list的内部构造函数逻辑不知道如何处理“关联列表”作为输入。

答案 1 :(得分:1)

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