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