Perl's @foo[3,7,1,-1] ?

Lie Ryan lie.1296 at gmail.com
Sun Jun 14 03:34:12 EDT 2009


Piet van Oostrum wrote:
>>>>>> kj <no.email at please.post> (k) wrote:
> 
>> k> Switching from Perl here, and having a hard time letting go...
> 
>> k> Suppose I have an "array" foo, and that I'm interested in the 4th, 8th,
>> k> second, and last element in that array.  In Perl I could write:
> 
>> k>   my @wanted = @foo[3, 7, 1, -1];
> 
>> k> I was a bit surprised when I got this in Python:
> 
>>>>>> wanted = foo[3, 7, 1, -1]
>> k> Traceback (most recent call last):
>> k>   File "<stdin>", line 1, in <module>
>> k> TypeError: list indices must be integers
> 
>> k> Granted, Perl's syntax is often obscure and hard-to-read, but in
>> k> this particular case I find it quite transparent and unproblematic,
>> k> and the fictional "pythonized" form above even more so.
> 
>> k> The best I've been able to come up with in Python are the somewhat
>> k> Perl-like-in-its-obscurity:
> 
>>>>>> wanted = map(foo.__getitem__, (3, 7, 1, -1))
> 
>> k> or the clearer but unaccountably sesquipedalian
> 
>>>>>> wanted = [foo[i] for i in 3, 7, 1, -1]
>>>>>> wanted = [foo[3], foo[7], foo[7], foo[-1]]
> 
>> k> Are these the most idiomatically pythonic forms?  Or am I missing
>> k> something better?
> 
> Do it yourself:
> 
> class MyList(list):
>     def __getitem__(self, indx):
>         if isinstance (indx, tuple):
>             return [self[i] for i in indx]
>         else:
>             return list.__getitem__(self, indx)
> 
> l = MyList((range(10)))
> 
> print l[3, 7, 1, -1]
> print l[3]
> print l[3:7]
> 
> # and now for something completely different
> 
> print l[3, (7, 1), -1]
> 

even better:

print l[3, 4:10:2, 7]



More information about the Python-list mailing list