2013-09-25 24 views
3

所以,我是一個試圖學習python的php程序員。我有一個字典詞典,我想排序。我把它們變成了OrderedDict。他們排序完美, 原來的字典看起來像這樣。這只是一個3維陣列吧?如何枚舉Python中的OrderedDict

a["01/01/2001"]["un"]=1 
a["01/01/2001"]["nn"]=1 
a["01/02/2001"]["aa"]=2 
a["01/02/2001"]["bb"]=2 
a["01/03/2001"]["zz"]=3 
a["01/03/2001"]["rr"]=3 

我可以將它們轉換成OrderedDict,並想將它們按以下格式

"01/01/2001" un=1 nn=1 
"01/02/2001" aa=2 bb=2 
"01/03/2001" zz=3 rr=3 

我可以用PHP編寫經歷這種關聯數組一個簡單的循環,但我不能弄清楚如何在python中做到這一點。有人可以幫忙嗎?

+0

OrderedDict不等於「排序字典」。它意味着「保存項目插入字典的順序」,所以只有按照排序順序插入時纔會對它們進行排序。爲了*總是*按排序的鍵順序獲取字典,使用'鍵爲排序的(dictvar.iteritems()):中的鍵',並且不需要OrderedDict能夠執行此操作的開銷。 – PaulMcG

+0

感謝您的建議。那麼,我該如何根據日期對上面的字典詞典進行排序,並以上述格式呈現它們?我對python很陌生,我很困惑 – user2773013

回答

3

使用dict.items()dict.iteritems()方法遍歷鍵和值;後者可以讓你無需重複建設鍵值對的中介名單:

for date, data in a.iteritems(): 
    print date, 
    for key, value in data.iteritems(): 
     print '{}={}'.format(key, value), 
    print 

直接在字典循環讓你鍵,而不是;你仍然可以通過使用訂閱訪問值:

for date in a: 
    print date, 
    for key in a[date]: 
     print '{}={}'.format(key, a[date][key]), 
    print 
+0

我得到了一個錯誤: for data.iteritems()中的值: AttributeError:'function'對象沒有屬性'iteritems' – user2773013

+0

@ user2773013它看起來像'tld'是一個函數。在你原來的問題中,似乎變量'a'是你試圖迭代的字典。試試'a.iteritems()'。 – Nitzle

+0

@ user2773013:你還有什麼存儲在'a'中?在'a'中至少*一個你的值似乎是一個函數。 –

2

我想,而不是OrderedDict,你將與一個defaultdict更好:

from collections import defaultdict 

a = defaultdict(dict) 
a["01/03/2001"]["zz"]=3 
a["01/01/2001"]["un"]=1 
a["01/02/2001"]["aa"]=2 
a["01/01/2001"]["nn"]=1 
a["01/02/2001"]["bb"]=2 
a["01/03/2001"]["rr"]=3 

# a is now a dict of dicts, each key is a date and each value is a dict of all 
# subkey-values 

# print out in date order 
for k,v in sorted(a.items()): 
    # for each subdict, print key=value in sorted key order 
    print k, ' '.join("%s=%s" % (kk,vv) for kk,vv in sorted(v.items())) 

打印:

01/01/2001 nn=1 un=1 
01/02/2001 aa=2 bb=2 
01/03/2001 rr=3 zz=3 

編輯:

啊!我的壞,你想插入順序所示的K = V值,所以你需要OrderedDict的的defaultdict:

from collections import defaultdict, OrderedDict 

a = defaultdict(OrderedDict) 
a["01/01/2001"]["un"]=1 
a["01/01/2001"]["nn"]=1 
a["01/02/2001"]["aa"]=2 
a["01/02/2001"]["bb"]=2 
a["01/03/2001"]["zz"]=3 
a["01/03/2001"]["rr"]=3 

# print out in date order 
for k,v in sorted(a.items()): 
    # for each subdict, print key=value in as-inserted key order, so no sort requred 
    print k, ' '.join("%s=%s" % (kk,vv) for kk,vv in v.items()) 

打印:

01/01/2001 un=1 nn=1 
01/02/2001 aa=2 bb=2 
01/03/2001 zz=3 rr=3 
0

試試這個代碼。

a = { 
     "01/01/2001": {"un": 1, "nn": 1}, \ 
     "01/02/2001": {"aa": 2, "bb": 2}, \ 
     "01/03/2001": {"zz": 3, "rr": 3} 
    } 

class decor(object): 
    def __init__(self, a): 
     self.a = a 

    def __call__(self, fun): 
     def wrapper(key, _list): 
      print key, ' '.join(["{}={}".format(ele, self.a[key][ele]) \ 
         for ele in _list 
        ]) 
      fun(key) 
     return wrapper 

@decor(a) 
def main_fun(key): 
    pass 

for key in sorted(a.keys()): 
    main_fun(key, [inner_key for inner_key in sorted(a[key].keys())])