2017-08-18 5 views
-3

私は一番外側の辞書と "中"の辞書の両方を、最も内側の辞書の "Cal"(最高のもの)の値でソートしようとしています。私はOrderedDictを使用してこれを達成したいと思います。以下の例を考えると3つのネストされたディクショナリがある場合、最も内側のディクショナリの値から上位の2つのネストされたディクショナリをソートしますか?

、私が達成しようとしているものを、この:すべての食品については

  • 、すなわち(最高カロリーで食物サブタイプを注文する - それは高いカロリーを持っているので、ピザのために、ペストは、最初に表示されますチーズと比較して
  • 注文は、最高のカロリーによってすべての食品 -

(すなわち、それは、他の食品よりも多くのカロリーを持つサブタイプを持っているとして、ピザは、最初に表示されます)I次のデータを含んでいます。

foods = 
{ 
    "Apple": { 
     "Red": { 
      "Cal": "1", 
      "Taste": "4" 
     }, 
     "Green": { 
      "Cal": "2", 
      "Taste": "6"  
     } 
    }, 
    "Pizza": { 
     "Pesto": { 
      "Cal": "200", 
      "Taste": "9" 
     }, 
     "Cheese": { 
      "Cal": "100", 
      "Taste": "11" 
     }  
    } 
} 

これは私が探しています結果である:

d = 
{ 
    "Pizza": { 
     "Pesto": { 
      "Cal": "200", 
      "Taste": "9" 
     }, 
     "Cheese": { 
      "Cal": "100", 
      "Taste": "11"  
     } 
    }, 
    "Apple": { 
     "Green": { 
      "Cal": "2", 
      "Taste": "6" 
     }, 
     "Red": { 
      "Cal": "1", 
      "Taste": "4" 
     }  
    } 
} 
+1

...辞書が順序付けられていません。 [OrderedDict'](https://docs.python.org/2/library/collections.html#collections.OrderedDict)にあなたのデータがありますか? –

+0

私はOrderedDictに入れたい辞書を持っています – avalon

+0

それを試してみてください!あなたが困ったら、問題を再現する[最小、完全で検証可能な例](https://stackoverflow.com/help/mcve) に戻ってください。 –

答えて

0

これは動作するはずです:

from collections import OrderedDict 

od = OrderedDict() 
for food, dct in sorted(foods.items(), 
         key=lambda x: max(int(y['Cal']) for y in x[1].values()), 
         reverse=True): 
    od[food] = OrderedDict() 
    subod = od[food] 
    for subkey, subdct in sorted(dct.items(), key=lambda x: int(x[1]['Cal']), 
           reverse=True): 
     subod[subkey] = subdct 

新しい入力でこれが与える:

# from pprint import pprint 
# pprint(od) 

OrderedDict([('Cheesecake', 
       OrderedDict([('ExtraSweet', {'Cal': '18000', 'Taste': '16'}), 
          ('Sweet', {'Cal': '12000', 'Taste': '17'})])), 
      ('IceCream', 
       OrderedDict([('Chocolate', {'Cal': '2000', 'Taste': '9'}), 
          ('Vanilla', {'Cal': '1000', 'Taste': '11'})])), 
      ('Pizza', 
       OrderedDict([('Pesto', {'Cal': '200', 'Taste': '9'}), 
          ('Cheese', {'Cal': '100', 'Taste': '11'})])), 
      ('Apple', 
       OrderedDict([('Green', {'Cal': '20', 'Taste': '6'}), 
          ('Red', {'Cal': '1', 'Taste': '4'})]))]) 

(しかししてください、 :あなたの次の質問については、tourを読んで、0を読んでくださいを入力し、minimal, complete and verifiable exampleを入力してください)。

+0

質問にお答えいただきありがとうございます。私は次の質問をする前にツアーに従います。残念ながら、提供されるソリューションは、各食品の内部食品タイプのみを分類するが、食品自体は分類しない。私はコードを実行した直後に "d"に食品を追加し、 "od"を印刷することでこれをテストしました。 – avalon

+0

申し訳ありませんが、質問を少し誤解...今は良いですか? –

+0

完璧に動作します!ありがとう – avalon

0

私は非平凡な方法でそれを解決することができました。ここに書き直された問題とその解決策です。誰かがショットを撮りたいと思えば、説明があるより単純な解決策に感謝します。

import json 
from collections import OrderedDict 
from operator import itemgetter 

foods = { 
    "Apple": { 
     "Red": { 
      "Cal": "1", 
      "Taste": "4" 
     }, 
     "Green": { 
      "Cal": "20", 
      "Taste": "6"  
     } 
    }, 
    "Pizza": { 
     "Pesto": { 
      "Cal": "200", 
      "Taste": "9" 
     }, 
     "Cheese": { 
      "Cal": "100", 
      "Taste": "11" 
     }  
    }, 
    "Cheesecake": { 
     "Sweet": { 
      "Cal": "12000", 
      "Taste": "17" 
     }, 
     "ExtraSweet": { 
      "Cal": "18000", 
      "Taste": "16" 
     }  
    }, 
    "IceCream": { 
     "Chocolate": { 
      "Cal": "2000", 
      "Taste": "9" 
     }, 
     "Vanilla": { 
      "Cal": "1000", 
      "Taste": "11" 
     }  
    } 
} 

foodDict = {} 
foodTypeDict = {} 
ary = [] 

# This orders the food types for each food 

for food in foods.iteritems(): 
    foodTypeDict[food[0]] = OrderedDict(sorted(food[1].iteritems(), key=lambda x: x[1]['Cal'],reverse=True)) 

# This orders the entire dictionary of food 

for food,value in foodTypeDict.iteritems(): 
    for a in value.iteritems(): 
     ary.append(a[1]['Cal']) 
    foodDict[food] = float(max(ary)) 
    ary = [] 

sFoodDict = OrderedDict(sorted(foodDict.iteritems(), key=lambda x:x[1], reverse=True)) 

# Create final dictionary with contents of former two dictionaries 

for a in sFoodDict.items(): 
    sFoodDict[a[0]] = foodTypeDict[a[0]] 

print(json.dumps(sFoodDict,indent=4)) 
関連する問題