Steve Grafton
Steve Grafton

Reputation: 1961

Adding Items to Python Dictionary

I may have understood this wrong but looking at the examples found in "Learning Python" by O'Reilly I tried to do the following:

>>> d={}
>>> d['h']='GG'
>>> d['f']='JJ'
>>> d['h']='PP'
>>> print d
{'h': 'PP', 'f': 'JJ'}

Now instead of the 'key' 'h' having two entries 'GG' and 'PP' it only has the last entry, the last one replacing the first one. I want BOTH in the same key.

>>> d['h']+='RR'
>>> print d
{'h': 'PPRR', 'f': 'JJ'}

Again this doesn't work, what I wanted was not a concatenated string but comma-separated entires.

I am confused why this does not work.

Upvotes: 1

Views: 441

Answers (2)

mdml
mdml

Reputation: 22912

It sounds like you want your dictionary to have 'h' map to a list of strings, which you can do as follows:

>>> d={}
>>> d['f']='JJ'
>>> d['h']=['PP']
>>> d['h'].append( 'RR' )
>>> d
{'h': ['PP', 'RR'], 'f': 'JJ'}

If you want all the keys of your dictionary to map to a list (instead of just 'h'), you can use collection.defaultdict as demonstrated in @MartijnPieters's answer.

Upvotes: 1

Martijn Pieters
Martijn Pieters

Reputation: 1124858

Your use-case is handled nicely by the collections.defaultdict() type instead:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['h'].append('GG')
>>> d['f'].append('JJ')
>>> d['h'].append('PP')
>>> d
defaultdict(<type 'list'>, {'h': ['GG', 'PP'], 'f': ['JJ']})

A regular dictionary maps one key to one value, if you want that value to be a list, then you should make it a list, and append to the list instead.

You don't have to use a defaultdict() object, you can always make your values explicit lists:

>>> d = {}
>>> d['h'] = ['GG']
>>> d['f'] = ['JJ']
>>> d['h'].append('PP')
>>> print d
{'h': ['GG', 'PP'], 'f': ['JJ']}

but now you need to create the lists explicitly. The latter problem can then be circumvented again by using dict.setdefault():

>>> d = {}
>>> d.setdefault('h', []).append('GG')
>>> d.setdefault('f', []).append('JJ')
>>> d.setdefault('h', []).append('PP')

which is just a more verbose way of using what defaultdict() objects can provide directly.

Upvotes: 6

Related Questions