python list comprehension crate multiple dictionary

Question:

In python list comprehension I can create a single flattened dictionary easily but I want to create a nested dictionary with some subkeys.

What I am doing:

import json

jsn = """
{
  "availResponse": {
    "roomStayInfos": [
      {
        "rateCodeID": 400166,
        "amount": 9000,
        "depositAmount": 0,
        "baseAmt": 9000
      },
      {
        "rateCodeID": 402451,
        "amount": 96000,
        "depositAmount": 0,
        "baseAmt": 96000
      },
      {
        "rateCodeID": 400164,
        "amount": 9000,
        "depositAmount": 0,
        "baseAmt": 9000
      },
      {
        "rateCodeID": 402598,
        "amount": 5100,
        "depositAmount": 0,
        "baseAmt": 9000
      }
    ]
  }
}
"""

availability = json.loads(jsn, strict=False)
depositAmounts = {
        str(rs["rateCodeID"]): rs["depositAmount"]
        for rs in availability["availResponse"]["roomStayInfos"]
}

print(depositAmounts)

This is working fine but I want to make 2 more subkeys for that dictionary but I don’t want to do separate iterations. Like:

amount = {
            str(rs["rateCodeID"]): rs["amount"]
            for rs in availability["availResponse"]["roomStayInfos"]
    }
baseAmt = {
            str(rs["rateCodeID"]): rs["baseAmt"]
            for rs in availability["availResponse"]["roomStayInfos"]
    }

What I can do: It is working as expected

diposite_amount_baseamount = {
"depositAmounts" : {},
"amount" : {},
"baseAmt" : {},
}
for rs in availability["availResponse"]["roomStayInfos"]:
    diposite_amount_baseamount["depositAmounts"].update({ str(rs["rateCodeID"]): rs["depositAmount"]})
    diposite_amount_baseamount["amount"].update({ str(rs["rateCodeID"]): rs["amount"]})
    diposite_amount_baseamount["baseAmt"].update({ str(rs["rateCodeID"]): rs["baseAmt"]})

print(diposite_amount_baseamount)

Expected Output

{
  "depositAmounts": {
    "400164": 0,
    "400166": 0,
    "402451": 0,
    "402598": 0
  },
  "amount": {
    "400164": 9000,
    "400166": 9000,
    "402451": 96000,
    "402598": 5100
  },
  "baseAmt": {
    "400164": 9000,
    "400166": 9000,
    "402451": 96000,
    "402598": 9000
  }
}

The above code is working fine but I want to know the syntax to create a nested dictionary generation process while using list comprehension, I assume it is only the syntax that I am looking for now nothing else. Two reasons to ask this question, (1) list comprehension seems less code. (2) I don’t want to iterate multiple times for the same list element to build the nested dictionary.

Asked By: Always Sunny

||

Answers:

You would necessarily have to map things a little before processing, i.e.

map_ = [
    ("depositAmounts", "rateCodeID", "depositAmount"),
    #              ^  : 3 elements because of this "s"
    ("amount", "rateCodeID", "amount"),
    ("baseAmt", "rateCodeID", "baseAmt"),
]

and then

room_stay_infos = availability["availResponse"]["roomStayInfos"]
diposite_amount_baseamount = {
    k: {
        str(rs[out_]): rs[in_]
        for rs in room_stay_infos
    }
    for k, out_, in_ in map_
}
Answered By: keepAlive
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.