# flattening a dict

Boris Borcic bborcic at gmail.com
Mon Feb 18 17:49:59 CET 2008

```Duncan Booth wrote:
> Boris Borcic <bborcic at gmail.com> wrote:
>
>> It is more elementary in the mathematician's sense, and therefore
>> preferable all other things being equal, imo. I've tried to split
>> 'gen' but I can't say the result is so much better.
>>
>> def flattendict(d) :
>>        gen = lambda L : (x for M in exp(L) for x in rec(M))
>>        exp = lambda L : (L+list(kv) for kv in L.pop().iteritems())
>>        rec = lambda M : gen(M) if isinstance(M[-1],dict) else [M]
>>        return dict((tuple(L[:-1]),L[-1]) for L in gen([d]))
>
> Why, why, why, why are you using lambda here?

Because the 3 lambdas make manifest that they could be combined into a single
expression and thus reveal that they replace a single expression.

> It only makes the code harder

Matter of perceptions. I myself tend to find

def g(...) :
def f(x) :
return (whatever)
return y(f)

a bit hard to follow. So frankly I don't feel it betters anything to write

def flattendict(d) :
def gen(L) :
return (x for M in exp(L) for x in rec(M))

def exp(L) :
return (L+list(kv) for kv in L.pop().iteritems())

def rec(M) :
return gen(M) if isinstance(M[-1],dict) else [M]

return dict((tuple(L[:-1]),L[-1]) for L in gen([d]))