2017-04-12 89 views
1

我有一个字典,其中的键包含时间戳。基本上我想对那个时间戳上的字典进行排序;所以我可以获取与“第一个”时间戳对应的字典值。按键排序字典 - 解压错误

我想:

from __future__ import print_function 

from collections import OrderedDict 
from datetime import datetime 

def _fetch_ts(name): 
    return datetime.strptime(name[-13:], '%Y%m%d_%H%M') 

incoming_dict = {'20170410_1133': 'A', '20170412_1133': 'B'} 
print("starting with: {}".format(incoming_dict)) 
sorted_dict = OrderedDict(sorted(incoming_dict, key=_fetch_ts)) 
print("gives  : {}".format(incoming_dict)) 
print("should be A or B: {}".format(sorted_dict.values()[0])) 

但是,打印

starting with: {'20170410_1133': 'A', '20170412_1133': 'B'} 
Traceback (most recent call last): 
    File "test.py", line 13, in <module> 
    sorted_dict = OrderedDict(sorted(incoming_dict, key=_fetch_ts)) 
    File "/usr/lib/python2.7/collections.py", line 69, in __init__ 
    self.__update(*args, **kwds) 
    File "/usr/lib/python2.7/_abcoll.py", line 571, in update 
    for key, value in other: 
ValueError: too many values to unpack 

所以我在做什么错在这里?

+2

你那种字典键而不是键值对,。使用'sorted(incoming_dict.items(),...)'。 – vaultah

回答

1

您应该使用incoming_dict.items()从incoming_dict解压值对。

OrderedDict(sorted(incoming_dict.items(), key=_fetch_ts)) 

如前所述,您需要修改_fetch_ts为好,但是你可以很容易地只是参考name[0][-13:]

+0

您还需要更改'_fetch_ts'。 – vaultah

+0

太好了,谢谢。 – GhostCat

1

您可以通过预先排序并重建它作为元组列表来重建OrderedDict。

喜欢:

from __future__ import print_function 

from collections import OrderedDict 
from datetime import datetime 

def _fetch_ts(name): 
    val = datetime.strptime(name[-13:], '%Y%m%d_%H%M') 
    return val 

incoming_dict = {'20170410_1133': 'A', '20170412_1133': 'B'} 
print("starting with: {}".format(incoming_dict)) 
print(sorted(incoming_dict, key=_fetch_ts)) 
sorted_dict = OrderedDict([(x,incoming_dict[x]) for x in sorted(incoming_dict, key=_fetch_ts)]) 
print("gives  : {}".format(incoming_dict)) 
print("should be A or B: {}".format(sorted_dict.values()[0])) 
+0

这是一个很好的细节。但我认为我会采用第一种解决方案;我发现它更具可读性。 – GhostCat