简体   繁体   English

Python OrderedDict 按日期排序

[英]Python OrderedDict ordered by date

I am trying to use an OrderedDict (Raymond Hettingers version for pre2.7 Python) where my keys are dates.我正在尝试使用我的键是日期的 OrderedDict(用于 pre2.7 Python 的 Raymond Hettingers版本)。 However it does not order them correctly, I imagine it may be ordering based on the ID.但是它没有正确订购它们,我想它可能是根据 ID 订购的。

Does anyone have any suggestions of how this could be done?有人对如何做到这一点有任何建议吗?

In [1]: from collections import OrderedDict

In [2]: import operator

In [3]: from datetime import date

In [4]: d = {date(2012, 1, 1): 123, date(2010,2,5): 542, date(2011,3,3):76 }

In [5]: d # Good old dict
Out[5]: #it seems sorted, but it isn't guaranteed to be that way.
{datetime.date(2010, 2, 5): 542,
 datetime.date(2011, 3, 3): 76,
 datetime.date(2012, 1, 1): 123}

In [6]: o = OrderedDict(sorted(d.items(), key=operator.itemgetter(0)))

In [7]: o #Now it is ordered(and sorted, because we give it by sorted order.).
Out[7]: OrderedDict([(datetime.date(2010, 2, 5), 542), (datetime.date(2011, 3, 3), 76), (datetime.date(2012, 1, 1), 123)])

OrderedDict, according to its docstring, is a kind of dict that remembers insertion order. OrderedDict,根据其文档字符串,是一种记住插入顺序的字典。 Thus, you need to manually insert the key/value pairs in the correct order.因此,您需要以正确的顺序手动插入键/值对。

# assuming unordered_dict is a dict that contains your data 
ordered_dict = OrderedDict()
for key, value in sorted(unordered_dict.iteritems(), key=lambda t: t[0]):
    ordered_dict[key] = value

edit: See utdemir's answer for a better example.编辑:请参阅 utdemir 的答案以获得更好的示例。 Using operator.itemgetter gives you better performance (60% faster, I use the benchmark code below) and it's a better coding style.使用operator.itemgetter可以获得更好的性能(快 60%,我使用下面的基准代码)并且它是一种更好的编码风格。 And you can apply OrderedDict directly to sorted(...) .您可以将OrderedDict直接应用于sorted(...)

a = (1, 2)

empty__func = 0
def empty():
    for i in xrange(N_RUNS):
        empty__func

lambda_func = lambda t: t[0]
def using_lambda():
    for i in xrange(N_RUNS):
        lambda_func(a)

getter_func = itemgetter(0)
def using_getter():
    for i in xrange(N_RUNS):
        getter_func(a)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM