Simple question about Python lists

Robert Kern robert.kern at gmail.com
Tue Nov 11 20:22:15 EST 2008


Steven D'Aprano wrote:
> On Wed, 12 Nov 2008 10:08:45 +1100, Ben Finney wrote:
> 
>> Eric <eric.shain at gmail.com> writes:
>>
>>> I'm learning Python (while coming from MATLAB). One question I have is
>>> that if I have a list with say 8 elements, and I want just a few of
>>> them how do I select them out. In MATLAB, if I just want the first,
>>> fifth and eighth element I might do something like this:
>>>
>>> b = a([1 5 8]);
>>>
>>> I can't seem to figure out a similar Python construct for selecting
>>> specific indices. Any suggestions?
>> Yes: the above code uses magic numbers which convey no semantic meaning,
>> and should instead use *named* elemets of a container. In Python, that's
>> done with a mapping type, which has the built-in type of ‘dict’.
>>
>> In other words: a list is best for sequences where any item is
>> semantically identical to any other, and you can (for example) re-order
>> all the elements in the list without changing their semantic meaning.
>> If, instead, you want semantic meaning, that's best done via *names*,
>> not magic numbers.
> 
> 
> While I see your point, and in practice there are circumstance where I 
> would agree with you, I don't agree in general.
> 
> What the OP is asking for is a generalization of slicing. Slices already 
> take a stride:
> 
> 
>>>> alist = range(20)
>>>> alist[2:17:3]
> [2, 5, 8, 11, 14]
> 
> Given a slice alist[start:end:stride] the indices are given by the 
> sequence start+i*stride, bounded by end. It seems to me that the OP has 
> asked how to take a slice where the indices are from an arbitrary set, 
> possibly given by an equation, but not necessarily. No practical examples 
> come to mind just off the top of my head, but given that the OP is coming 
> from a Matlab background, I bet they involve some pretty hairy maths.
> 
> Hmmm... let's see now...
> 
> http://en.wikipedia.org/wiki/Series_(mathematics)
> #Summations_over_arbitrary_index_sets
> 
> To put it another way... suppose you have a sequence S given by a list, 
> and a set of indexes I (perhaps given by a tuple or a set), and you want 
> to sum the terms of S at those indexes, which mathematicians apparently 
> have good reason for doing, then you might write in Python:
> 
> sum(S[i] for i in I)
> 
> But if there was slicing support for arbitrary indexes, you could write:
> 
> sum(S[I])
> 
> which is apparently what Matlab allows. Standard lists don't support this 
> slicing generalization, but numpy arrays do.

It's also worth noting that using a literal list is pretty rare. Usually the 
index array/list comes from some other computation. The OP was just trying to be 
describe the feature he wanted; that's not always the same thing as the use case 
that drives the feature.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco




More information about the Python-list mailing list