Find a given key's value in a nested ordered dict python

社会主义新天地 提交于 2019-12-20 04:23:47

问题


I am trying to find the value of a given key from a nested OrderedDict.

Key points:

  • I don't know how deep this dict will be nested
  • The name of the key I am looking for is constant, it will be somewhere in the dict

I would like to return the value of the key called "powerpoint_color" in this example...

mydict= OrderedDict([('KYS_Q1AA_YouthSportsTrustSportParents_P',
                      OrderedDict([('KYS_Q1AA',
                                    OrderedDict([('chart_layout', '3'),
                                                 ('client_name', 'Sport Parents (Regrouped)'),
                                                 ('sort_order', 'asending'),
                                                 ('chart_type', 'pie'),
                                                 ('powerpoint_color', 'blue'),
                                                 ('crossbreak', 'Total')]))])),

My initial thought is to do something like this:

print mydict[x][i]['powerpoint_color']

But I get this error:

list indices must be integers, not str

Any advice?


回答1:


If you don't know at which depth the key will appear, you will need to march through the whole dictionary.

I was so free as to convert your data to an actual ordered dictionary. The function may yield more than one result in the case that the same key appears in different sub-directories:

from collections import OrderedDict

mydict = OrderedDict ( {'KYS_Q1AA_YouthSportsTrustSportParents_P':
            OrderedDict ( {'KYS_Q1AA':
                OrderedDict ( [ ('chart_layout', '3'),
                 ('client_name', 'Sport Parents (Regrouped)'),
                 ('sort_order', 'asending'),
                 ('chart_type', 'pie'),
                 ('powerpoint_color', 'blue'),
                 ('crossbreak', 'Total')
                 ] ) } ) } )

def listRecursive (d, key):
    for k, v in d.items ():
        if isinstance (v, OrderedDict):
            for found in listRecursive (v, key):
                yield found
        if k == key:
            yield v

for found in listRecursive (mydict, 'powerpoint_color'):
    print (found)

If you are interested in where you have found the key, you can adapt the code accordingly:

def listRecursive (d, key, path = None):
    if not path: path = []
    for k, v in d.items ():
        if isinstance (v, OrderedDict):
            for path, found in listRecursive (v, key, path + [k] ):
                yield path, found
        if k == key:
            yield path + [k], v

for path, found in listRecursive (mydict, 'powerpoint_color'):
    print (path, found)



回答2:


Try this

mydict = ['KYS_Q1AA_YouthSportsTrustSportParents_P',
        ['KYS_Q1AA',
           [{'chart_layout': '3'},
            {'client_name': 'Sport Parents (Regrouped)'},
             {'sort_order': 'asending'},
             {'chart_type': 'pie'},
             {'powerpoint_color': 'blue'},
             {'crossbreak':'Total'}
             ]]]

Then...

print mydict[1][1][4]['powerpoint_color']



回答3:


You are looking for

print [y[1] for y in mydict[x][i] if y[0] == 'powerpoint_color']

This filters the deepest tuple to look for powerpoint_color in the first item, and keeps only the second one.



来源:https://stackoverflow.com/questions/21708586/find-a-given-keys-value-in-a-nested-ordered-dict-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!