Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make lists automatically instantiate on use in Python as they do in Perl?

Tags:

python

perl

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?

like image 905
aXqd Avatar asked Dec 05 '22 02:12

aXqd


2 Answers

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

like image 77
rbp Avatar answered Dec 08 '22 01:12

rbp


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)
like image 20
Amber Avatar answered Dec 07 '22 23:12

Amber