Yaron Shragai
Yaron Shragai

Reputation: 147

Loop through 1st + 3rd level of a dictionary

I'm wondering if there's a Pythonic way to squash this nested for loop:

dict = {
   "keyA": { "subkey1": { "A1a": "frog", "A1b": "dog", "A1c": "airplane" } },
   "keyA": { "subkey2": { "A2a": "cat" } },
   "keyB": { "subkey1": { "B1a": "Zorba", "B1q": ["popcorn", -34] } },
   "keyB": { "subkey2": { "B2z": "A Man A Plan A Canal", "B2e": "armadillo", "B2w": [1, 3, "jump"] } },
   "keyC": { "subkey1": { "C1a": 3.14, "C1z": { "aaa": "dishwater", "bbb": "Dishwalla" }, "C1x": "bat" } },
   "keyC": { "subkey2": { "C2a": None, "C2b": 123 } }
}

for key in dict.keys():
    for subsubkey in dict[key]["subkey2"].keys():
        print(key+":"+subsubkey)

Output:

keyA:A2a
keyB:B2z
keyB:B2e
keyB:B2w
keyC:C2a
keyC:C2b

Upvotes: 0

Views: 36

Answers (1)

bbnumber2
bbnumber2

Reputation: 628

One Pythonic way to solve this is to use list comprehension. This allows you to define a list within a single line, following the for loop structure you have already laid out. A working version may look something like:

final_keys = [(first_key, second_key) for first_key in dict.keys() for second_key in dict[first_key]['subkey2'].keys()]

Outputting (from your dataset):

[('keyA', 'A2a'), ('keyB', 'B2z'), ('keyB', 'B2e'), ('keyB', 'B2w'), ('keyC', 'C2a'), ('keyC', 'C2b')]

Upvotes: 1

Related Questions