blackmamba
blackmamba

Reputation: 1982

Add multiple values to dictionary

Here is my code:

for response in responses["result"]:
    ids = {}
    key = response['_id'].encode('ascii')
    print key
    for value in response['docs']:
        ids[key].append(value)

Traceback:

  File "people.py", line 47, in <module>
    ids[key].append(value)
  KeyError: 'deanna'

I am trying to add multiple values to a key. Throws an error like above

Upvotes: 1

Views: 147

Answers (3)

Ryan Haining
Ryan Haining

Reputation: 36782

If I'm reading this correctly your intention is to map the _id of a response to its docs. In that case you can bring down everything you have above to a dict comprehension:

ids =  {response['_id'].encode('ascii'): response['docs']
        for response in responses['result']}

This also assumes you meant to have id = {} outside of the outermost loop, but I can't see any other reasonable interpretation.


If the above is not correct,

You can use collections.defaultdict

import collections # at top level

#then in your loop:

ids = collections.defaultdict(list) #instead of ids = {}

A dictionary whose default value will be created by calling the init argument, in this case calling list() will produce an empty list which can then be appended to.

To traverse the dictionary you can iterate over it's items()

for key, val in ids.items(): 
    print(key, val)

Upvotes: 1

cbare
cbare

Reputation: 12458

The reason you're getting a KeyError is this: In the first iteration of your for loop, you look up the key in an empty dictionary. There is no such key, hence the KeyError.

The code you gave will work, if you first insert an empty list into the dictionary under to appropriate key. Then append the values to the list. Like so:

for response in responses["result"]:
ids = {}
key = response['_id'].encode('ascii')
print key
if key not in ids:    ## <-- if we haven't seen key yet
  ids[key] = []       ## <-- insert an empty list into the dictionary
for value in response['docs']:
    ids[key].append(value)

The previous answers are correct. Both defaultdict and dictionary.setdefault are automatic ways of inserting the empty list.

Upvotes: 0

mhlester
mhlester

Reputation: 23211

Check out setdefault:

ids.setdefault(key, []).append(value)

It looks to see if key is in ids, and if not, sets that to be an empty list. Then it returns that list for you to inline call append on.

Docs: http://docs.python.org/2/library/stdtypes.html#dict.setdefault

Upvotes: 3

Related Questions