2016-01-21 89 views
0

我的字典裏是這樣的:蟒蛇:排序3級嵌套的字典

 {modID1:{sequences1:{header1:count1},sequences2:{header2:count2}...}, 
     modID2:{sequences1:{header1:count1},sequences2:{header2:count2}...}....} 

我想通過 「計數」, 例如排序扭轉 「序列」:

{modID1: 
    {sequences1:{header1: 3},sequences2:{header2:5}, 
    sequences3: {header3:1}...}, 
modID2:{sequences1:{header1:1},sequences2:{header2:8},...}, 
....} 

通緝輸出:

{modID1: 
    {sequences2:{header2:5},sequences1:{header1: 3}, 
    sequences3:{header3:1}...}, 
modID2:{sequences2:{header2:8},sequences1:{header1:1},...}, 
....} 

我已經看到一些帖子,我試圖用這樣的:

for k,v in Dic.iteritems(): 
    sorted=OrderedDict(sorted(v.iteritems(), key=lambda h: v[seq for seq in v][header], reverse=True)) 

但我想我沒有得到完全此功能,這樣不正常的使用。建議?

預先感謝您

+0

工作你要包含其它'OrderedDict's的'OrderedDict'。目前,你正在創建一個'OrderedDict',其中包含'dict's –

+0

你也可以通過賦值將'sorted'內建隱藏到'sorted',所以第二次繞着循環一切都會中斷。你真的有字典只有一個鍵,價值對在底部 - 不會是一個元組嗎? – AChampion

+0

底部的{header:count}在創建Dic期間被修改,實際上「count」從1開始,並且可以增加。創建Dic之後,有一種方法可以將它轉換爲元組?或者我可以從一開始修改元組? –

回答

0

蟒蛇3例

d = { 
"modID1": 
    { 
     "sequences1": {"header1": 3}, 
     "sequences2": {"header2": 5}, 
     "sequences3": {"header3": 1} 
    }, 
"modID2": 
    { 
     "sequences1": {"header1": 1}, 
     "sequences2": {"header2": 8}, 
    }, 
} 
result = { 
    k: OrderedDict(
     sorted(
      v.items(), # "sequences1": {"header1": 3},"sequences2":  {"header2": 5},"sequences3": {"header3": 1} 
      key=lambda h: next( # h is (sequences1,{"header1": 3}) 
       iter(
        h[1].values() # h[1] is {"header1": 3} 
       ) 
      ), 
      reverse=True 
     ) 
    ) for k, v in d.items()} 

print(result) 

輸出是

{'modID1': OrderedDict([('sequences2', {'header2': 5}), ('sequences1', {'header1': 3}), ('sequences3', {'header3': 1})]), 'modID2': OrderedDict([('sequences2', {'header2': 8}), ('sequences1', {'header1': 1})])} 

我改變您的lambda函數從lambda h: v[seq for seq in v][header]lambda h: next(iter(h[1].values())

  1. h("sequences", {"header": count})
  2. h[1]{"header": count}
  3. next(iter(h[1].values())的第一值{ 「頭」:計數} getting first value of dict
  4. {"header": count}第一值是count

在Python 3 items()iteritems()dict.items() and dict.iteritems()

+0

完美的作品!謝謝 –

+0

不客氣。標記爲「回答」我的或AChampion的答案,無論你喜歡什麼。 –

0

假設你不關心外部字典的秩序和公正的序列內http://stardict.sourceforge.net/Dictionaries.php下載,那麼你可以這樣做:

>>> from collections import OrderedDict 
>>> data = {'modID1': {'sequences2':{'header2':5}, 'sequences1':{'header1': 3}, 
...     'sequences3':{'header3':1}}, 
...   'modID2': {'sequences2':{'header2':8},'sequences1':{'header1': 1}}} 
>>> {k: OrderedDict(sorted(v.items(), key=lambda x: -sum(x[1].values()))) 
... for k, v in data.items()} 
{'modID1': OrderedDict([('sequences2', {'header2': 5}), ('sequences1', {'header1': 3}), 
         ('sequences3', {'header3': 1})]), 
'modID2': OrderedDict([('sequences2', {'header2': 8}), ('sequences1', {'header1': 1})])}