Explicitly select items from a list or tuple Explicitly select items from a list or tuple python python

Explicitly select items from a list or tuple


list( myBigList[i] for i in [87, 342, 217, 998, 500] )

I compared the answers with python 2.5.2:

  • 19.7 usec: [ myBigList[i] for i in [87, 342, 217, 998, 500] ]

  • 20.6 usec: map(myBigList.__getitem__, (87, 342, 217, 998, 500))

  • 22.7 usec: itemgetter(87, 342, 217, 998, 500)(myBigList)

  • 24.6 usec: list( myBigList[i] for i in [87, 342, 217, 998, 500] )

Note that in Python 3, the 1st was changed to be the same as the 4th.


Another option would be to start out with a numpy.array which allows indexing via a list or a numpy.array:

>>> import numpy>>> myBigList = numpy.array(range(1000))>>> myBigList[(87, 342, 217, 998, 500)]Traceback (most recent call last):  File "<stdin>", line 1, in <module>IndexError: invalid index>>> myBigList[[87, 342, 217, 998, 500]]array([ 87, 342, 217, 998, 500])>>> myBigList[numpy.array([87, 342, 217, 998, 500])]array([ 87, 342, 217, 998, 500])

The tuple doesn't work the same way as those are slices.


What about this:

from operator import itemgetteritemgetter(0,2,3)(myList)('foo', 'baz', 'quux')


It isn't built-in, but you can make a subclass of list that takes tuples as "indexes" if you'd like:

class MyList(list):    def __getitem__(self, index):        if isinstance(index, tuple):            return [self[i] for i in index]        return super(MyList, self).__getitem__(index)seq = MyList("foo bar baaz quux mumble".split())print seq[0]print seq[2,4]print seq[1::2]

printing

foo['baaz', 'mumble']['bar', 'quux']