trouble building data structure

Steven D'Aprano steve+comp.lang.python at pearwood.info
Mon Sep 29 09:52:01 EDT 2014


David Alban wrote:

> greetings,
> 
> i'm writing a program to scan a data file.  from each line of the data
> file
> i'd like to add something like below to a dictionary.  my perl background
> makes me want python to autovivify, but when i do:
> 
>       file_data = {}
> 
>       [... as i loop through lines in the file ...]
> 
>           file_data[ md5sum ][ inode ] = { 'path' : path, 'size' : size, }
> 
> i get:
> 
> Traceback (most recent call last):
>   File "foo.py", line 45, in <module>
>     file_data[ md5sum ][ inode ] = { 'path' : path, 'size' : size, }
> KeyError: '91b152ce64af8af91dfe275575a20489'
> 
> what is the pythonic way to build my "file_data" data structure above that
> has the above structure?

Others have suggested using a defaultdict, but here's an older solution: use
the setdefault method on regular dicts.

This fails:

py> file_data = {}
py> file_data[1234][23] = {'spam': 1, 'eggs': 2}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 1234


But this succeeds:

py> file_data.setdefault(1234, {})[23] = {'spam': 1, 'eggs': 2}
py> file_data.setdefault(5678, {})[42] = {'spam': 3, 'cheese': 1}
py> file_data
{1234: {23: {'spam': 1, 'eggs': 2}}, 5678: {42: {'spam': 3, 'cheese': 1}}}

Whether you prefer to use setdefault, or a defaultdict, is a matter of
taste.


-- 
Steven




More information about the Python-list mailing list