Slice lists and extended slicing
Chris Rebert
clp2 at rebertia.com
Wed Jan 26 13:17:45 EST 2011
On Wed, Jan 26, 2011 at 9:20 AM, Gerald Britton
<gerald.britton at gmail.com> wrote:
> I'm looking at extended slicing and wondering when and how to use slice lists:
>
> slicing ::= simple_slicing | extended_slicing
> simple_slicing ::= primary "[" short_slice "]"
> extended_slicing ::= primary "[" slice_list "]"
> slice_list ::= slice_item ("," slice_item)* [","]
> slice_item ::= expression | proper_slice | ellipsis
> proper_slice ::= short_slice | long_slice
> short_slice ::= [lower_bound] ":" [upper_bound]
> long_slice ::= short_slice ":" [stride]
> lower_bound ::= expression
> upper_bound ::= expression
> stride ::= expression
> ellipsis
>
> The semantics for an extended slicing are as follows. The primary must
> evaluate to a mapping object, and it is indexed with a key that is
> constructed from the slice list, as follows. If the slice list
> contains at least one comma, the key is a tuple containing the
> conversion of the slice items; otherwise, the conversion of the lone
> slice item is the key. The conversion of a slice item that is an
> expression is that expression. The conversion of an ellipsis slice
> item is the built-in Ellipsis object. The conversion of a proper slice
> is a slice object (see section The standard type hierarchy) whose
> start, stop and step attributes are the values of the expressions
> given as lower bound, upper bound and stride, respectively,
> substituting None for missing expressions.
>
> I'd thought that I could do this:
>
>>>> l = [1,2,3,4,5]
>>>> l[0:1, 3:4]
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: list indices must be integers, not tuple
>
> but that clearly doesn't work! So, when and how can one use slice lists?
When the object you're slicing supports it, which is rarely. None of
the built-in types support multiple proper_slices like your example; I
know of no std lib classes that do either. However, the 3rd party
matrix library NumPy very well might.
Normally, one would instead write your example as: l[0:1] + l[3:4]
Cheers,
Chris
--
http://blog.rebertia.com
More information about the Python-list
mailing list