retrieve item from nested list given index tuple

A

Alan G Isaac

`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.)

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. 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 ...

Thanks,
Alan Isaac
 
S

Steven D'Aprano

`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

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:
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:
'a'

operator.getitem is less ugly too.
 
C

Colin J. Williams

Steven said:
`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:
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:
'a'

operator.getitem is less ugly too.

Colin W.
 
D

Dave Angel

Colin said:
`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.
<snip>

You missed the point: he's retrieving *an* item from a list that's
nested arbitrarily. Each item in the tpl (tuple) is a simple integer.


DaveA
 
C

Colin J. Williams

Dave said:
Colin said:
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.
<snip>

You missed the point: he's retrieving *an* item from a list that's
nested arbitrarily. Each item in the tpl (tuple) is a simple integer.


DaveA
Yes, you are right.

Colin W.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top