3

キーが日付であるOrderedDict(2.7以前のPython用のRaymond Hettingersバージョン)を使用しようとしています。ただし、正しく注文されていないので、IDに基づいて注文しているのではないかと思います。

誰かがこれをどのように行うことができるかについて何か提案がありますか?

4

2 に答える 2

9
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)])
于 2011-07-13T11:21:37.883 に答える
5

OrderedDictは、そのdocstringによると、挿入順序を記憶する一種のdictです。したがって、キーと値のペアを正しい順序で手動で挿入する必要があります。

# 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

編集:より良い例については、utdemirの回答を参照してください。を使用operator.itemgetterすると、パフォーマンスが向上し(60%高速、以下のベンチマークコードを使用)、コーディングスタイルも向上します。そして、あなたは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)
于 2011-07-13T11:16:53.777 に答える