2

このループのアイデアは、リストを反復処理することでした。オブジェクトの特定のプロパティが OrderedDict のキーでない場合は、それを追加します。オブジェクトのリストの辞書です

for object in someList:
  if object.DATE not in myOrderedDict:
     myOrderedDict[object.DATE]=[]
  myOrderedDict[object.DATE].append(object)

OrderedDict をほとんど正しく作成しているように見えますが、印刷すると順序が狂ってしまいます。のようなものではなく、 のよう(01/13) (02/13) (03/13)になります(02/13) (03/13) (01/13)
なぜこれが起こり、どうすれば修正できますか?

4

6 に答える 6

5

純粋な Python のsortedcontainers モジュールには、役立つSortedDict型があります。辞書キーを自動的にソートされた順序で維持し、十分に文書化され、テストされています。dict と同じように使用します。

>>> from sortedcontainers import SortedDict
>>> mySortedDict = SortedDict()
>>> for object in someList:
>>>     if object.DATE not in mySortedDict:
>>>         mySortedDict[object.DATE]=[]
>>>     mySortedDict[object.DATE].append(object)
>>> list(mySortedDict.keys())
['(01/13)', '(02/13)', '(03/13)']

ソートされたコンテナー モジュールは非常に高速で、代替実装に対するベンチマークを含むパフォーマンス比較ページがあります。

于 2014-08-11T19:04:19.900 に答える
0

あなたが得ていると思うものの例をモックアップしました.OrderedDictは挿入した順序を保持します.これはあなたが望むものではないかもしれません. その場合、sorted() ソリューションを見ることができます。これは明確にする必要があります:

import collections

class ob():
    def __init__(self, d, v):
        self.DATE = d
        self.VALUE = v

orderedDict = collections.OrderedDict()
normalDict = {}

someList = [ob('02/13', 2), ob('03/13',3), ob('04/13', 4) , ob('01/13', 5), ob('02/13', 15)]

for a in someList:
  if a.DATE not in orderedDict:
     orderedDict[a.DATE]=[]
     normalDict[a.DATE]=[]
  orderedDict[a.DATE].append(a)
  normalDict[a.DATE].append(a)

orderedDictSorted = collections.OrderedDict(sorted(orderedDict.items()))

print 'Ordered Dict'
print orderedDict.keys()
print 'Dict'
print normalDict.keys()
print 'Ordered Dict Sorted'
print orderedDictSorted.keys()
于 2013-07-23T16:03:15.313 に答える
0

この機能はruamel.ordereddict、2007 年以降、Python 2 に (PyPI から利用可能) 含まれています。

from ruamel.ordereddict import sorteddict

(これは高速な C 実装です。免責事項: 私はそのパッケージの作成者です)。

于 2016-05-02T07:06:41.420 に答える