tags:

views:

141

answers:

3

In Perl, I can do this:

push(@{$h->[x]}, y);

Can I simplify the following python codes according to above Perl example?

if x not in h:
  h[x] = []
h[x].append(y)

I want to simplify this, because it goes many places in my code, (and I cannot initialize all possible x with []). I do not want to make it a function, because there is no 'inline' keyword.

Any ideas?

+3  A: 

You can use setdefault

h = {}
h.setdefault(x, []).append(y)
Stephen
+4  A: 

There are a couple of ways to do this with the dict methods:

h.setdefault(x, []).append(y)

or

h[x] = h.pop(x,[]).append(y)
Amber
pop() way is smart :P
aXqd
`pop()` is cute, but is also slower, because the `h.pop` approach modifies `h` twice, whereas the `h.setdefault` approach generally only modifies the list h[x]. In other words, `setdefault` has a good reason to exist. :)
EOL
+9  A: 

A very elegant way (since Python 2.5) is to use defaultdict from the "collections" module:

>>> from collections import defaultdict
>>> h = defaultdict(list)
>>> h['a'].append('b')
>>> h
defaultdict(<type 'list'>, {'a': ['b']})

defaultdict is like a dict, but provides a default value using whichever constructor you passed to it when you created it (in this example, a list).

I particularly like this over the setdefault dict method, because 1) you define the variable as a defaultdict, and generally no other changes are required on the code (except perhaps to remove previous kludges for default values); and 2) setdefault is a terrible name :P

rbp