Simple question about Python lists

Ben Finney bignose+hates-spam at
Wed Nov 12 02:31:28 CET 2008

Steven D'Aprano <steven at> writes:

> On Wed, 12 Nov 2008 10:08:45 +1100, Ben Finney wrote:
> > Eric <eric.shain at> writes:
> >> In MATLAB, if  I just want the first, fifth  and eighth element I
> >> might do something like this:
> >> 
> >> b = a([1 5 8]);
> > 
> > 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.
> What the OP is asking for is a generalization of slicing.

I don't think so. (The OP is, of course, welcome to respond to
this or existing requests for clarification of their intent.)

> 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.

I think that's exactly what is *not* being asked for, based on the
specific example given. The example was “I just want the first,
fifth, and eighth element”, and the example implementation showed
them with those numeric literals in the code. On that basis I
interpreted the need for *those elements specifically*, for some
semantic reason not yet disclosed.

If, instead, the OP wanted to retrieve “indices … from an arbitrary
set, possibly given by an equation”, I would recommend that *that
equation* be abstracted behind an expression, or even a well-named
function, that would make explicit what the *meaning* of the set was.

I maintain that anything which expresses “retrieve the indices at
these numbers” without saying *in the code* what the meaning of those
numbers is, is to be deprecated in favour of an implementation that
makes the semantic meaning explicit.

And no, before anyone suggests it, an explanatory comment is not
sufficient for this condition: the names and types used should make
clear what the meaning of the expression is. A comment saying *why* is
always appreciated; but if the comment needs to tell me *what* the
code is doing or *how*, the code instead needs to be re-written to be

 \      “Saying that Java is nice because it works on all OSes is like |
  `\     saying that anal sex is nice because it works on all genders” |
_o__)                                                — |
Ben Finney

More information about the Python-list mailing list