Amir Asyraf
Amir Asyraf

Reputation: 680

Adding multiple list or items to a dictionary key

I wasn't sure how to word the title, but basically I have the following:

{
  "restaurantName": "Restaurant 1",
  "restaurantLink": "Link 1",
  "restaurantType": "Type 1",
  "restaurantAddress": "Address 1",
  "dateRetrieved": "14-11-2018",
  "review": {
    "reviewer": "Reviewer 1",
    "reviewDetail": "Review Detail 1"
  }
}

I'm trying to add new review to the review key, so the final output would look like this depending on how many reviews a restaurant have:

{
  "restaurantName": "Restaurant 1",
  "restaurantLink": "Link 1",
  "restaurantType": "Type 1",
  "restaurantAddress": "Address 1",
  "dateRetrieved": "14-11-2018",
  "review": [
    {
      "reviewer": "Reviewer 1",
      "reviewDetail": "Review Detail 1"
    },
    {
      "reviewer": "Reviewer 2",
      "reviewDetail": "Review Detail 2"
    },{
      "reviewer": "Reviewer 3",
      "reviewDetail": "Review Detail 3"
    },
    ...
    ...
  ]
}

My current code is:

for review in reviews:
  HungrygowhereItem['review'] = {
      [
        'reviewer': reviewer,
        'reviewDetail': reviewDetail
      ]
  }

Where HungrygowhereItem is an existing dictionary

It would only store Reviewer 1 and Review Detail 1. How would I append a new list to the dictionary?

I found this: Append items to dictionary , it's relevant to my question, but in different language.

Upvotes: 1

Views: 73

Answers (3)

Sagi Golan
Sagi Golan

Reputation: 41

If I understand you correctly, you would like to append value to array in existing dict, so for the following dict for example:

_dict = {
      "restaurantName": "Restaurant 1",
      "restaurantLink": "Link 1",
      "restaurantType": "Type 1",
      "restaurantAddress": "Address 1",
      "dateRetrieved": "14-11-2018",
      "review": [
        {
          "reviewer": "Reviewer 1",
          "reviewDetail": "Review Detail 1"
        },
        {
          "reviewer": "Reviewer 2",
          "reviewDetail": "Review Detail 2"
        },{
          "reviewer": "Reviewer 3",
          "reviewDetail": "Review Detail 3"
        }
      ]
    }

append value into review:

_dict['review'].append( {
          "reviewer": "Reviewer 4",
          "reviewDetail": "Review Detail 4"
        })

In your case, if HungrygowhereItem is a dictionary:

for review in reviews:
  if 'review' in HungrygowhereItem:
      HungrygowhereItem['review'].append({
           'reviewer': reviewer,
           'reviewDetail': reviewDetail
       })
   else:
      HungrygowhereItem['review'] = [{
           'reviewer': reviewer,
           'reviewDetail': reviewDetail
       }]

Upvotes: 1

timgeb
timgeb

Reputation: 78770

First, make the value for the key 'review' a list.

>>> restaurant = {
...:  "restaurantName": "Restaurant 1",
...:  "restaurantLink": "Link 1",
...:  "restaurantType": "Type 1",
...:  "restaurantAddress": "Address 1",
...:  "dateRetrieved": "14-11-2018",
...:  "review": {
...:    "reviewer": "Reviewer 1",
...:    "reviewDetail": "Review Detail 1"
...:  }
...:}
>>> 
>>> restaurant['review'] = [restaurant['review']]
>>> restaurant['review']
>>> [{'reviewDetail': 'Review Detail 1', 'reviewer': 'Reviewer 1'}]

Now you can append to that list.

>>> reviews = [{"reviewer": "Reviewer 2",
...:            "reviewDetail": "Review Detail 2"},
...:           {"reviewer": "Reviewer 3",
...:           "reviewDetail": "Review Detail 3"}]
...:           
>>> for review in reviews:
...:    restaurant['review'].append(review)
...:    
>>> restaurant['review']
>>> 
[{'reviewDetail': 'Review Detail 1', 'reviewer': 'Reviewer 1'},
 {'reviewDetail': 'Review Detail 2', 'reviewer': 'Reviewer 2'},
 {'reviewDetail': 'Review Detail 3', 'reviewer': 'Reviewer 3'}]

You could also make restaurant a defaultdict without a 'review' key if you can fix the code upstream.

>>> from collections import defaultdict
>>> restaurant = {
...:  "restaurantName": "Restaurant 1",
...:  "restaurantLink": "Link 1",
...:  "restaurantType": "Type 1",
...:  "restaurantAddress": "Address 1",
...:  "dateRetrieved": "14-11-2018"
...:}
>>> 
>>> restaurant = defaultdict(list, restaurant)
>>> reviews = [{"reviewer": "Reviewer 1",
...:            "reviewDetail": "Review Detail1"},
...:           {"reviewer": "Reviewer 2",
...:            "reviewDetail": "Review Detail 2"},
...:           {"reviewer": "Reviewer 3",
...:           "reviewDetail": "Review Detail 3"}]
...:      
>>> restaurant['reviews'].extend(reviews)
>>> restaurant['reviews']
>>> 
[{'reviewDetail': 'Review Detail1', 'reviewer': 'Reviewer 1'},
 {'reviewDetail': 'Review Detail 2', 'reviewer': 'Reviewer 2'},
 {'reviewDetail': 'Review Detail 3', 'reviewer': 'Reviewer 3'}]

As an alternative to restaurant being a defaultdict, you could just set the value of the key 'reviews' to an empty list before adding any reviews.

Upvotes: 1

Zaur Nasibov
Zaur Nasibov

Reputation: 22679

You have to start with a little bit different review structure:

restaurant = {
  ...,
  "review": []
}

Note, that review is a list here.

Hence, adding a review to that list is just a basic list operation:

restaurant['review'].append({
    "reviewer": "Reviewer 1",
    "reviewDetail": "Review Detail 1"
})

Upvotes: 1

Related Questions