简体   繁体   中英

Dynamic approach to iterate nested dict and list of dict in Python

I am looking for a dynamic approach to solve my issue. I have a very complex structure, but for simplicity,

I have a dictionary structure like this:

dict1={
      "outer_key1" : {
      "total" : 5              #1.I want the value of "total" 
      },
      "outer_key2" : 
      [{
       "type": "ABC",          #2. I want to count whole structure where type="ABC"
       "comments": {
       "nested_comment":[
        {
          "key":"value",
          "id": 1
        },      
        {
         "key":"value",
         "id": 2
        } 
       ]                       # 3. Count Dict inside this list.
    }}]}  

I want to this iterate dictionary and solve #1, #2 and #3.

My attempt to solve #1 and #3:

def getTotal(dict1):
    #for solving #1
    for key,val in dict1.iteritems():
        val = dict1[key]
        if isinstance(val, dict):
            for k1 in val:
                if k1=='total':
                    total=val[k1]  
                    print total                              #gives output 5
        #for solving #3
        if isinstance(val,list):
            print len(val[0]['comment']['nested_comment'])   #gives output 2
            #How can i get this dynamicallty?  

Output:

total=5  
2

Que 1 :What is a pythonic way to get the total number of dictionaries under "nested_comment" list ?
Que 2 :How can i get total count of type where type="ABC". (Note: type is a nested key under "outer_key2")

Que 1 :What is a pythonic way to get the total number of dictionaries under "nested_comment" list ?

User Counter from the standard library.

from collections import Counter

my_list = [{'hello': 'world'}, {'foo': 'bar'}, 1, 2, 'hello']
dict_count = Counter([x for x in my_list if type(x) is dict])

Que 2 :How can i get total count of type where type="ABC". (Note: type is a nested key under "outer_key2")

It's not clear what you're asking for here. If by "total count", you are referring to the total number of comments in all dicts where "type" equals "ABC":

abcs = [x for x in dict1['outer_key2'] if x['type'] == 'ABC']
comment_count = sum([len(x['comments']['nested_comment']) for x in abcs])

But I've gotta say, that is some weird data you're dealing with.

You got answers for #1 and #3, check this too

from collections import Counter
dict1={
      "outer_key1" : {
      "total" : 5              #1.I want the value of "total" 
      },
      "outer_key2" : 
      [{
       "type": "ABC",          #2. I want to count whole structure where      type="ABC"
   "comments": {
   "nested_comment":[
    {
      "key":"value",
      "key": "value"
    },      
    {
     "key":"value",
     "id": 2
    } 
   ]                       # 3. Count Dict inside this list.
}}]}


print "total:   ",dict1['outer_key1']['total']
print "No of nested comments:   ", len(dict1['outer_key2'][0]['comments']  ['nested_comment']), 

Assuming that below is the data structure for outer_key2 this is how you get total number of comments of type='ABC'

dict2={
  "outer_key1" : {
  "total" : 5              
  },
  "outer_key2" : 
  [{
   "type": "ABC",         
   "comments": {'...'}
   },
   {
   "type": "ABC",          
   "comments": {'...'}
   },
   {
   "type": "ABC",         
   "comments": {'...'}
   }]}

i=0
k=0
while k < len(dict2['outer_key2']):
    #print k
    if dict2['outer_key2'][k]['type'] == 'ABC':
        i+=int(1)
    else:
        pass
    k+=1
print ("\r\nNo of dictionaries with type = 'ABC' : "), i

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM