Appending list of key:value pairs without adding more curly braces in Python

Question:

I need to append a list of key:value pairs multiple times. However, this produces additional curly braces after each .append().

Basically, I have something like this:

textToDump = {"food": "cereal_bowl",
                      "ingredients":[]}
    
textToDump["ingredients"].append({"milk": 100,
                                 "cereal": 100,
                                 })
textToDump["ingredients"].append({"honey": 10})
print(textToDump)

which results in:

{'food': 'cereal_bowl', 'ingredients': [{'milk': 100, 'cereal': 100}, {'honey': 10}]}

what I need is:

{'food': 'cereal_bowl', 'ingredients': [{'milk': 100, 'cereal': 100, 'honey': 10]}

I also tried using dictionary+.update() instead of list. However, I need to be able to have duplicate entries in my structure ("ingredients"). What would be the simplest way of achieving this?

Thanks in advance.

Asked By: Andrej

||

Answers:

textToDump = {"food": "cereal_bowl", "ingredients": []}

textToDump["ingredients"].append(
    {
        "milk": 100,
        "cereal": 100,
    }
)
textToDump["ingredients"][0].update({"honey": 10})

Answered By: Muhammad Faizan
textToDump = {"food": "cereal_bowl",
                      "ingredients":[]}
    
textToDump["ingredients"].append({"milk": 100,
                                 "cereal": 100,
                                 })
if textToDump["ingredients"]:
    textToDump["ingredients"][0].update({"honey": 10})

print(textToDump)

output:

{
  "food": "cereal_bowl",
  "ingredients": [
    {
      "milk": 100,
      "cereal": 100,
      "honey": 10
    }
  ]
}

You desired output says you need a list that has only single dictionary item. So add your first dictionary like before(by .appending), then for the next dictionaries, you need to grab the first dictionary and update it:

textToDump["ingredients"].append({"milk": 100, "cereal": 100})
textToDump["ingredients"][0].update({"honey": 10})

However I don’t think you need a list here. Why not just having a dictionary for ingredients?

textToDump = {"food": "cereal_bowl", "ingredients": {}}

textToDump["ingredients"].update({"milk": 100, "cereal": 100})
textToDump["ingredients"].update({"honey": 10})
textToDump["ingredients"]["something-else"] = 20

In case these dictionaries come separately and they are have overlapped keys, I would suggest using collections.Counter object. You can then easily use its .update method:

from collections import Counter
textToDump = {"food": "cereal_bowl", "ingredients": Counter()}

textToDump["ingredients"].update({"milk": 100, "cereal": 100})
textToDump["ingredients"].update({"milk": 10})
print(textToDump)
Answered By: S.B
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.