retrieve item from nested list given index tuple

Colin J. Williams cjw at ncf.ca
Fri Aug 14 19:57:18 CEST 2009


Steven D'Aprano wrote:
> On Fri, 14 Aug 2009 15:54:54 +0000, Alan G Isaac wrote:
> 
>> `lst` is a nested list
>>
>> `tpl` is the indexes for an item in the list
> 
>> What is the nice way to retrieve the item? (Speedy access is nice.)
> 
> Assuming you want to do this frequently, write a helper function, then 
> use it:
> 
> # Untested
> def extract(nested, indexes):
>     for index in indexes:
>         nested = nested[index]
>     return nested

This looks OK for the first level of nesting.  We are not told much about tpl 
but suppose that:

lst= [a, [b, [c, d]], [e, f]] and that we wish to retrieve d and f from lst. 
tpl would need to be something like [[1, 1, 1], [2, 1]].

If that is the requirement, then Untested is only a step along the road, 
extract could be made recursive.

Colin W.
> 
> 
>> I don't want to use NumPy, but I'd like somehow to avoid an explicit
>> loop.  I did consider using eval.  E.g., eval('lst' +
>> '[%d]'*len(tpl)%tpl). It works but seems rather ugly.
> 
> And slow.
> 
> 
>> I kind of like
>> reduce(list.__getitem__, tpl, lst) but the reliance on reduce remains
>> controversial enough to see i removed from the Python 3 built-ins ...
> 
> It's just moved into functools.
> 
> 
>>>> lst = ['a', 'b', ['aa', ['aaa', 'bbb', 'ccc'], 'cc']]
>>>> from functools import reduce
>>>> lst = ['a', 'b', ['aa', ['aaa', 'bbb', 'ccc'], 'cc']]
>>>> reduce(list.__getitem__, (2, 1, 0), lst)
> 'aaa'
> 
> 
> However, it doesn't work too well as soon as you mix sequence types:
> 
>>>> reduce(list.__getitem__, (2, 1, 0, 0), lst)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: descriptor '__getitem__' requires a 'list' object but received 
> a 'str'
> 
> Try this instead:
> 
>>>> from operator import getitem
>>>> reduce(getitem, (2, 1, 0), lst)
> 'aaa'
>>>> reduce(getitem, (2, 1, 0, 0), lst)
> 'a'
> 
> operator.getitem is less ugly too.
> 
> 

Colin W.



More information about the Python-list mailing list