Concise idiom to initialize dictionaries

Larry Bates lbates at syscononline.com
Tue Nov 9 12:30:07 EST 2004


It is almost certain that you should use either a list of dictionaries
or a dictionary containing other dictionaries for this.  Creation of
26 distinct dictionaries is almost never a good solution as it makes
it nearly impossible to iterate over them and would make code to
manipulate them unable to be generalized easily.

Example:

#
# To create a list of dictionaries
#
list_of_dicts=[]
for i in range(26):
     list_of_dicts.append({})

#
# Now you can reference each dictionary as:
#
# list_of_dicts[0], list_of_dicts[1], ...
#

or

import string
dict_of_dicts={}
for letter in string.ascii_lowercase:
     dict_of_dicts[letter]={}

#
# Now you can reference each dictionary as:
#
# dict_of_dicts['a'], dict_of_dicts['b'], ...

Larry Bates


Frohnhofer, James wrote:
> My initial problem was to initialize a bunch of dictionaries at the start of a
> function.
> 
> I did not want to do
> def fn():
> 	a = {}
> 	b = {}
> 	c = {}
> 	. . .
> 	z = {}
> simply because it was ugly and wasted screen space.
> 
> First I tried:
> 
> 	for x in (a,b,c,d,e,f,g): x = {}
> 
> which didn't work (but frankly I didn't really expect it to.)
> Then I tried:
> 
> 	for x in ('a','b','c','d','e','f','g'): locals()[x]={}
> 
> which did what I wanted, in the interpreter.  When I put it inside a function,
> it doesn't seem to work.  If I print locals() from inside the function, I can
> see them, and they appear to be fine, but the first time I try to access one
> of them I get a "NameError: global name 'a' is not defined"
> 
> Now obviously I could easily avoid this problem by just initializing each
> dictionary, but is there something wrong about my understanding of locals,
> that my function isn't behaving the way I expect?
> 
> 
> 
> 
>>-----Original Message-----
>>From: python-list-bounces+james.frohnhofer=csfb.com at python.org
>>[mailto:python-list-bounces+james.frohnhofer=csfb.com at python.org]On
>>Behalf Of Dennis Lee Bieber
>>Sent: Tuesday, November 09, 2004 10:31 AM
>>To: python-list at python.org
>>Subject: Re: Determining combination of bits
>>
>>
>>On Mon, 8 Nov 2004 21:18:36 -0800, "news.west.cox.net"
>><sean.berry2 at cox.net> declaimed the following in comp.lang.python:
>>
>>
>>>>Note: 2^1 = 2, so your dictionary is already in error...
>>>>
>>>
>>>The dictionary was filled with arbitrary values, not
>>>{ x : 2^x } values like you might have thought.
>>
>>	Well, you had stated "powers of two"... If all you wanted is a
>>bit mapping you could probably drop the dictionary and just use a list
>>of the values, indexed by the bit position, and my first attempt
>>logic...
>>
>>
>>>It is actually more like {1:123, 2:664, 4:323, 8:990, 16:221... etc}
>>>
>>>
>>
>>CheckBoxes = [ "FirstChoice",
>>               "SecondChoice",
>>               "ThirdChoice",
>>               "FourthChoice",
>>               "FifthChoice",
>>               "SixthChoice" ]
>>
>>
>>for num in [22, 25, 9]:
>>    bit = 0
>>    while num:
>>        if num & 1:
>>            print CheckBoxes[bit],
>>        bit = bit + 1
>>        num = num >> 1
>>    print
>>
>>SecondChoice ThirdChoice FifthChoice
>>FirstChoice FourthChoice FifthChoice
>>FirstChoice FourthChoice
>>
>>where "num" is the sum of the checkbox index values (or whatever
>>selection mechanism is used), assuming /they/ were set up in 2^(n+1)
>>scheme (n = bit position, starting with 0)...
>>
>>-- 
>> > ============================================================== <
>> >   wlfraed at ix.netcom.com  | Wulfraed  Dennis Lee Bieber  KD6MOG <
>> >      wulfraed at dm.net     |       Bestiaria Support Staff       <
>> > ============================================================== <
>> >           Home Page: <http://www.dm.net/~wulfraed/>            <
>> >        Overflow Page: <http://wlfraed.home.netcom.com/>        <
>>-- 
>>http://mail.python.org/mailman/listinfo/python-list
>>
> 
> 
> ==============================================================================
> This message is for the sole use of the intended recipient. If you received
> this message in error please delete it and notify us. If this message was
> misdirected, CSFB does not waive any confidentiality or privilege. CSFB
> retains and monitors electronic communications sent through its network.
> Instructions transmitted over this system are not binding on CSFB until they
> are confirmed by us. Message transmission is not guaranteed to be secure.
> ==============================================================================
> 



More information about the Python-list mailing list