Steven D'Aprano wrote:
On Wed, 12 Nov 2008 10:08:45 +1100, Ben Finney wrote:
Eric <[EMAIL PROTECTED]> 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
--
http://mail.python.org/mailman/listinfo/python-list