From 2D table to dictionary

Alex Martelli aleax at
Mon Jan 21 05:46:31 EST 2002

"pekka niiranen" <krissepu at> wrote in message
news:3C4BC9A4.20709 at
> How to convert 2d table to a dictionary as follows:
> table is      'FILE'    'co1'    'co2'    'co3'
>                 'row1'    'a'        'b'        'c'
>                 'row2'    'A'        'B'        'C'
> or in python syntax:
> table = [['FILE', 'co1', 'co2', 'co3'], ['row1', 'a', 'b', 'c'],
> ['row2', 'A', 'B', 'C']]
> How to convert it to a nested dictionary like this:
> d = {'row1' : {'co1': 'a', 'co2': 'b', 'co3': 'c'}, 'row2' : {'co1':
> 'A', 'co2': 'B', 'co3': 'C'}}

def table_to_nested_dict(table):
    result_dict = {}
    nested_keys = table[0][1:]
    for a_row in table[1:]:
        toplevel_key = a_row[0]
        nested_values = a_row[1:]
        nested_dict = result_dict[toplevel_key] = {}
        for key, value in zip(nested_keys, nested_values):
            nested_dict[key] = value
    return result_dict

Strictly speaking, there is no _need_ for the assignments that this
function uses to name intermediate variables such as nested_keys,
toplevel_key, and so on; you COULD choose to code compactly, e.g.:

def t2nd(table):
    result = {}
    for a_row in table[1:]:
        for key, value in zip(table[0][1:], a_row[1:]):
            result.setdefault(a_row[0],{})[key] = value
    return result

However, it seems to me that the first version is vastly easier
to read and understand (and maintain if/when needed).


More information about the Python-list mailing list