Pythonでネストされた辞書の値を取得する

ローラ・スミス

私は次のようにネストされた辞書を持っています。

myTodo= {          
                'taskid': '10',
                'taskstatus': 'in progress',

                'Kitchen': 
                {                    
                    'Stove':{
                                'LED1':
                                {
                                'taskid': '11',
                                'taskstatus':'running'
                                },

                                'LED2':
                                {
                                    'taskid': '12',
                                    'taskstatus':'off',
                                    'LEDSub':
                                    { 
                                       'taskid': '13',
                                       'taskstatus':'stable',
                                       'LEDSub2':
                                        {
                                           'taskid': '14',
                                           'taskstatus':'burnt'
                                        }
                                    }
                                },

                                'LED3':
                                {
                                'taskid': '15',
                                'taskstatus':'new'
                                } 
                           },
                  //other nested layers
               }

「値」に到達するためのキーに基づいてルートを返すPythonメソッドがあります。その方法を以下に示します。

 def route(myTodo, id):
        q = list()
        q.append((list(), myTodo))
        while q:
            this_key_chain, this_v = reverse_linked_q.pop()
            # finish search if found the id 
            if this_v == id:
                return this_key_chain
            # not found. keep searching        
            try:
                items = this_v.items()
            except AttributeError:
                continue
            for k, v in items:
                q.append((this_key_chain + [k], v))
        raise KeyError

このメソッドは、キーの観点からルートを返します。したがって、私がそうするとroute(myTodo, "11")、リストkeyroute = ["Kitchen"、 "Stove"、 "LED1"、 "taskid"]が返されます。

次に、keyrouteリストから「taskid」を削除し、そのリストを次のメソッドに送信します。

    def createOutputDic(keyroute, myTodo):
        for k in keyroute:
            myTodo = myTodo.get(k)
        return j

の場合route(myTodo, "11")、からの出力createOutputDic(keyroute,myTodo)

{ 
 'taskid': '11',
 'taskstatus':'running'
}

この問題は、として電話をかけるときに発生しroute(myTodo, "12")ます。私は得ることを期待しています

{ 'taskid': '12',
  'taskstatus':'off'
}

しかし、結果は

{ 
  'taskid': '12',
  'taskstatus':'off',
  'LEDSub':
   { 
     'taskid': '13',
     'taskstatus':'stable',
   'LEDSub2':
   {
     'taskid': '14',
     'taskstatus':'burnt'
   }
}

ただ手に入れたい

{ 'taskid': '12',
  'taskstatus':'off'
}

しかし、現在のroute(..)メソッドがそれを実行できない理由がわかりません。辞書は深くネストすることができ、一般的なメソッドが必要です。誰かが私を助けたり、この問題を解決するためのより良い方法を教えてくれますか?どんな助けでも大歓迎です。

Ajax1234

ジェネレーターで再帰を使用できます

def get_data(d, val):
  if any(c == val for c in d.values()):
     yield {i:d.get(i) for i in ['taskid', 'taskstatus']}
  else:
     for i in d.values():
        if isinstance(i, dict):
           yield from get_data(i, val)

myTodo = {'taskid': '10', 'taskstatus': 'in progress', 'Kitchen': {'Stove': {'LED1': {'taskid': '11', 'taskstatus': 'running'}, 'LED2': {'taskid': '12', 'taskstatus': 'off', 'LEDSub': {'taskid': '13', 'taskstatus': 'stable', 'LEDSub2': {'taskid': '14', 'taskstatus': 'burnt'}}}, 'LED3': {'taskid': '15', 'taskstatus': 'new'}}}}
result = list(get_data(myTodo, '12'))
print(result if not result else result[0])

出力:

{'taskid': '12', 'taskstatus': 'off'}

出力をフォーマットするために、目的の出力に含まれているのと同じキーを使用して辞書が作成されます。yieldステートメントは、メモリ内の他のオブジェクトへのポイントは、オンザフライ「で生成された」というジェネレータオブジェクトを作成します。ジェネレーターベースのソリューションは、を使用するよりも少しクリーンです。return後者ではfor、各get_data呼び出しから返された結果を追加できる2番目のループの外側にリストを作成する必要があるためです。最終的には、呼び出しyieldごとに使用する方がクリーンget_dataです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされた辞書のキーと値を表形式で印刷する

分類Dev

ネストされた辞書の値を取得するPythonの安全な方法

分類Dev

Pythonでネストされた辞書を定義する

分類Dev

Python:ネストされた辞書の値に関数を適用する

分類Dev

ネストされた辞書の値を更新する-Python

分類Dev

ネストされた辞書の既存の値をループで更新する

分類Dev

辞書でネストされたキーの値を取得する

分類Dev

ネストされた辞書をpython3で印刷する

分類Dev

辞書のネストされた値を変更する

分類Dev

辞書のネストされた値を変更する

分類Dev

Pythonでネストされた辞書のキーと値を比較する

分類Dev

ネストされた辞書の値を合計する方法

分類Dev

リストの値でネストされた辞書を更新する

分類Dev

ネストされた辞書から最大値のキーを取得する

分類Dev

ネストされた辞書で最大値を検索するときのKeyError

分類Dev

Pythonで値を取得する辞書のネストされた辞書リスト

分類Dev

ネストされた値をPythonの辞書に挿入する

分類Dev

Python-辞書/ネストされた辞書のタプルを注文する

分類Dev

Pythonのネストされた辞書で同じキーを持つすべての値を取得するにはどうすればよいですか?

分類Dev

ネストされた辞書PythonOdooで値を取得する

分類Dev

内部のネストされた辞書を取得する

分類Dev

ネストされた辞書の値を変更する

分類Dev

python:一般的な方法でネストされた辞書の値を取得します

分類Dev

Pythonでネストされた辞書から値を取得する方法は?

分類Dev

ネストされた辞書からリストに値を取得する

分類Dev

Pythonの辞書値をネストされた辞書のstrからintに変換する

分類Dev

Pythonでネストされた辞書の共通部分を取得する

分類Dev

Python-ネストされた辞書でキーを取得する

分類Dev

PythonでJSONからネストされた辞書を取得する方法

Related 関連記事

  1. 1

    ネストされた辞書のキーと値を表形式で印刷する

  2. 2

    ネストされた辞書の値を取得するPythonの安全な方法

  3. 3

    Pythonでネストされた辞書を定義する

  4. 4

    Python:ネストされた辞書の値に関数を適用する

  5. 5

    ネストされた辞書の値を更新する-Python

  6. 6

    ネストされた辞書の既存の値をループで更新する

  7. 7

    辞書でネストされたキーの値を取得する

  8. 8

    ネストされた辞書をpython3で印刷する

  9. 9

    辞書のネストされた値を変更する

  10. 10

    辞書のネストされた値を変更する

  11. 11

    Pythonでネストされた辞書のキーと値を比較する

  12. 12

    ネストされた辞書の値を合計する方法

  13. 13

    リストの値でネストされた辞書を更新する

  14. 14

    ネストされた辞書から最大値のキーを取得する

  15. 15

    ネストされた辞書で最大値を検索するときのKeyError

  16. 16

    Pythonで値を取得する辞書のネストされた辞書リスト

  17. 17

    ネストされた値をPythonの辞書に挿入する

  18. 18

    Python-辞書/ネストされた辞書のタプルを注文する

  19. 19

    Pythonのネストされた辞書で同じキーを持つすべての値を取得するにはどうすればよいですか?

  20. 20

    ネストされた辞書PythonOdooで値を取得する

  21. 21

    内部のネストされた辞書を取得する

  22. 22

    ネストされた辞書の値を変更する

  23. 23

    python:一般的な方法でネストされた辞書の値を取得します

  24. 24

    Pythonでネストされた辞書から値を取得する方法は?

  25. 25

    ネストされた辞書からリストに値を取得する

  26. 26

    Pythonの辞書値をネストされた辞書のstrからintに変換する

  27. 27

    Pythonでネストされた辞書の共通部分を取得する

  28. 28

    Python-ネストされた辞書でキーを取得する

  29. 29

    PythonでJSONからネストされた辞書を取得する方法

ホットタグ

アーカイブ