How find all childrens values of a nested dictionary, fast!

macm moura.mario at gmail.com
Thu Nov 4 14:01:54 EDT 2010


Peter

Ok! Both works fine!

Thanks a lot!

>>> for v in f(a['a']['b']):
...     b.extend(v)

b

Now I will try find which script is the fast!

Regards

macm



On 4 nov, 15:56, macm <moura.ma... at gmail.com> wrote:
> Hi Folks
>
> Thanks a lot
>
> Script from Diez works:
>
> print list(f(a))
>
> but should be
>
> print list(f(a['a']['b']))
>
> to fit my example.
>
> About Peter script
>
> I am receiving
>
> >>> for v in f(a['a']['b']):
>
> ...     b.extend(v)
> ...
> Traceback (most recent call last):
>   File "<stdin>", line 2, in <module>
> TypeError: 'int' object is not iterable
>
> I am trying understand this error.
>
> Best Regards and thanks a lot again!
>
> Mario
> macm
>
> On 4 nov, 15:26, Peter Otten <__pete... at web.de> wrote:
>
> > macm wrote:
> > > How find all childrens values of a nested dictionary, fast!
>
> > >>>> a = {'a' : {'b' :{'/' :[1,2,3,4], 'ba' :{'/' :[41,42,44]} ,'bc'
> > >>>> :{'/':[51,52,54], 'bcd' :{'/':[68,69,66]}}},'c' :{'/' :[5,6,7,8]}},
> > >>>> 'ab' : {'/' :[12,13,14,15]}, 'ac' :{'/' :[21,22,23]}} a['a']
> > > {'c': {'/': [5, 6, 7, 8]}, 'b': {'ba': {'/': [41, 42, 44]}, '/': [1,
> > > 2, 3, 4], 'bc': {'bcd': {'/': [68, 69, 66]}, '/': [51, 52, 54]}}}
> > >>>> a['a']['b']
> > > {'ba': {'/': [41, 42, 44]}, '/': [1, 2, 3, 4], 'bc': {'bcd': {'/':
> > > [68, 69, 66]}, '/': [51, 52, 54]}}
> > >>>> a['a']['b'].values()
> > > [{'/': [41, 42, 44]}, [1, 2, 3, 4], {'bcd': {'/': [68, 69, 66]}, '/':
> > > [51, 52, 54]}]
>
> > > Now I want find all values of key "/"
>
> > > Desire result is [41, 42, 44, 1, 2, 3, 4, 68, 69, 66, 51, 52, 54]
>
> > > I am trying map, reduce, lambda.
>
> > Hmm, I'm trying none of these and get a different result:
>
> > >>> def f(d):
>
> > ...     stack = [d.iteritems()]
> > ...     while stack:
> > ...             for k, v in stack[-1]:
> > ...                     if k == "/":
> > ...                             yield v
> > ...                     else:
> > ...                             stack.append(v.iteritems())
> > ...                             break
> > ...             else:
> > ...                     stack.pop()
> > ...>>> b = []
> > >>> for v in f(a):
>
> > ...     b.extend(v)
> > ...>>> b
>
> > [5, 6, 7, 8, 41, 42, 44, 1, 2, 3, 4, 68, 69, 66, 51, 52, 54, 21, 22, 23, 12,
> > 13, 14, 15]
>
> > What am I missing?
>
> > Peter
>
>




More information about the Python-list mailing list