Indexing list of lists
Peter Otten
__peter__ at web.de
Sat Sep 20 08:32:37 EDT 2003
Lukasz Pankowski wrote:
> Sorry for my misunderstanding, yes it would be nice to have a
> posibility to index a sequence with a list of indices, here is a pure
> Python (>= 2.2) implementation of the idea:
>
> class List(list):
>
> def __getitem__(self, index):
> if isinstance(index, (tuple, list)):
> return [list.__getitem__(self, i) for i in index]
> else:
> return list.__getitem__(self, index)
>
>>>> l = List(range(0, 100, 10))
>>>> l[0,2,3]
> [0, 20, 30]
This is nice :-)
> but in this simple using both commas and slices will not work as
> expected
>
>>>> l[0,1,7:]
> [0, 10, [70, 80, 90]]
Your implementation can be extended to handle slices and still remains
simple:
class List3(list):
def __getitem__(self, index):
if hasattr(index, "__getitem__"): # is index list-like?
result = []
for i in index:
if hasattr(i, "start"): # is i slice-like?
result.extend(list.__getitem__(self, i))
else:
result.append(list.__getitem__(self, i))
return result
else:
return list.__getitem__(self, index)
I have used hasattr() instead of isinstance() tests because I think that the
"we take everything that behaves like X" approach is more pythonic than
"must be an X instance".
While __getitem__() is fairly basic for lists, I am not sure if start can be
considered mandatory for slices, though.
Peter
More information about the Python-list
mailing list