Loop over nested dicts

Question:

Suppose the following dict structure:

{'1': {'Deal_No': '2670034020',
  'Company': 'Test Corp.',
  'Date Low': '01.09.2014',
  'Date High': '03.09.2014',
  'SOURCE': [{'Apple': 0}, //Three items
   {'Samsung': 0},
   {'Sony': 0}],
  'CONTACT': [{'Apple': 0}, //Three items
   {'Samsung': 0},
   {'Sony': 0}],
  'FIRST': [{'Apple': 1}, //Three items
   {'Samsung': 0},
   {'Sony': 0}],
  'ABOUT': [{'Apple': 1}, //Three items
   {'Samsung': 0},
   {'Sony': 0}]},
 '2': {'Deal_No': '2642986020',
  'Company': 'Super Inc.',
  'Date Low': '02.06.2014',
  'Date High': '04.06.2014',
  'SOURCE': [{'Ford': 0}], //One items
  'CONTACT': [{'Ford': 1}], //One items
  'FIRST': [{'Ford': 0}], //One items
  'ABOUT': [{'Ford': 1}]}} //One items

Each outter dict (i.e., "1", "2"…) has another dict as it’s value whereas the dict keys "SOURCE", "CONTACT", "FIRST" and "ABOUT" again have a list of dicts as their values. The values for the dicts in the lists can either be 1 or 0. The keys for the dicts in the list are always the same within an outter dict.

Goal:
I want to loop over each outter dict and store the keys which all have 0 as value across the inner dicts "SOURCE", "CONTACT", "FIRST" and "ABOUT".
Example:
In the first outter dict with the key "1", the key "Samsung" has a value of 0 within every one of the four dicts, so I want to store the key "Samsung" in a list.
Same goes for the key "Sony".
On the other hand, "Apple" should not appear in that list as it has at least one non-zero value within the four dicts.

Asked By: xxgaryxx

||

Answers:

I’d just use a for loop.

for key in your_dict:
    print(key)

Get’s you each of the keys in your outer dict.
The next layer is accessed by using

for key in your_dict:
    for inner_key in your_dict[key]:
        print(your_dict[key][inner_key])

Though I’m sure there are better options.

Answered By: klnstngr

Try:

dct = {
    "1": {
        "Deal_No": "2670034020",
        "Company": "Test Corp.",
        "Date Low": "01.09.2014",
        "Date High": "03.09.2014",
        "SOURCE": [{"Apple": 0}, {"Samsung": 0}, {"Sony": 0}],
        "CONTACT": [{"Apple": 0}, {"Samsung": 0}, {"Sony": 0}],
        "FIRST": [{"Apple": 1}, {"Samsung": 0}, {"Sony": 0}],
        "ABOUT": [{"Apple": 1}, {"Samsung": 0}, {"Sony": 0}],
    },
    "2": {
        "Deal_No": "2642986020",
        "Company": "Super Inc.",
        "Date Low": "02.06.2014",
        "Date High": "04.06.2014",
        "SOURCE": [{"Ford": 0}],
        "CONTACT": [{"Ford": 1}],
        "FIRST": [{"Ford": 0}],
        "ABOUT": [{"Ford": 1}],
    },
}

keys = ["SOURCE", "CONTACT", "FIRST", "ABOUT"]

out = {}
for k, v in dct.items():
    tmp = {}
    for kk in keys:
        for d in v[kk]:
            tmp.setdefault(list(d)[0], []).append(list(d.values())[0])
    for kk, vv in tmp.items():
        if all(i == 0 for i in vv):
            out.setdefault(k, []).append(kk)

print(out)

Prints:

{"1": ["Samsung", "Sony"]}
Answered By: Andrej Kesely
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.