# How to say \$a=\$b->{"A"} ||={} in Python?

Paul McGuire ptmcg at austin.rr.com
Fri Aug 17 04:25:03 CEST 2007

```On Aug 16, 7:53 pm, beginner <zyzhu2... at gmail.com> wrote:
> On Aug 16, 6:21 pm, James Stroud <jstr... at mbi.ucla.edu> wrote:
>
>
>
>
>
> > beginner wrote:
> > > Hi All.
>
> > > I'd like to do the following in more succint code:
>
> > > if k in b:
> > >     a=b[k]
> > > else:
> > >     a={}
> > >     b[k]=a
>
> > > a['A']=1
>
> > > In perl it is just one line: \$a=\$b->{"A"} ||={}.
>
> > I'm afraid you've asked a non sequiter:
>
> > euler 40% cat test.pl
>
> > \$a=\$b->{"A"} ||={} ;
> > print "\$a\n" ;
>
> > \$b->{"B"} = 0 ;
> > \$a=\$b->{"B"} ||={} ;
> > print "\$a\n" ;
>
> > \$b->{"X"} = 15 ;
> > \$a=\$b->{"X"} ||={} ;
> > print "\$a\n" ;
>
> > euler 41% perl test.pl
> > HASH(0x92662a0)
> > HASH(0x926609c)
> > 15
>
> > James
>
> > --
> > James Stroud
> > UCLA-DOE Institute for Genomics and Proteomics
> > Box 951570
> > Los Angeles, CA 90095
>
> >http://www.jamesstroud.com/
>
> It is not supposed to be used this way.
> \$b is supposed to be a hash-table of hash-table. If a key exists in
> \$b, it points to another hash table. The \$a=\$b->{"A"} ||={} pattern is
> useful when you want to add records to the double hash table.
>
> For example, if you have a series of records in the format of (K1, K2,
> V), and you want to add them to the double hash-table, you can do
> \$a=\$b->{K1} || ={}
> \$a->{K2}=V- Hide quoted text -
>
> - Show quoted text -

I think this demonstrates the Python version of what you describe.

-- Paul

from collections import defaultdict

data = [
('A','B',1), ('A','C',2), ('A','D',3), ('B','A',4),
('B','B',5), ('B','C',6), ('B','D',7),
]

def defaultdictFactory():
return defaultdict(dict)

table = defaultdict(defaultdictFactory)

for k1,k2,v in data:
table[k1][k2] = v

for kk in sorted(table.keys()):
print "-",kk
for jj in sorted(table[kk].keys()):
print "  -",jj,table[kk][jj]

prints:

- A
- B 1
- C 2
- D 3
- B
- A 4
- B 5
- C 6
- D 7

```