On Aug 16, 7:53 pm, beginner <[EMAIL PROTECTED]> wrote: > On Aug 16, 6:21 pm, James Stroud <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list