What does list[x::y] do?

Question:

Possible Duplicate:
Good Primer for Python Slice Notation

I’ve been reading over some sample code lately and I’ve read quite a few websites but I just can’t seem to get the query right to give me an answer I’m looking for. If anyone could help me out I’d appreciate it.

Asked By: pri0ritize

||

Answers:

It means create a new list from x until the end with step y:

>>> l = range(10)
>>> list(l[2::2])
[2, 4, 6, 8]
Answered By: Rob Wouters

Returns a list containing every yth element of list starting at index x.

>>> alist = range(10)
>>> alist[0::2]
[0, 2, 4, 6, 8]
Answered By: philofinfinitejest

It slices

x[startAt:endBefore:skip]

if you use skip = 2, every other element the list beginning at startAt and ending at endBefore will be selected. [Remember: indices live BETWEEN list elements]

To see this, enter

x = range(100)

at the Python prompt. Then try these things

x[::2]
x[::3]
x[10:40:6]

and see what happens.

Answered By: ncmathsadist

This is a Slice.

[start:end:step]

Leaving any blank puts them at a default value, in your case it is taking every y elements starting at x and going until the end of the list.

See: What is :: (double colon) in Python when subscripting sequences?

Answered By: Jeff B

This is the syntax for list slicing.
When you say,

list[a:b:c],

a is the starting index, b is the ending index and c is the optional step size.
This will give you a list starting at index a(inclusive) and ending at index b(exclusive) picking elements at a step of c.

For example,

l = [1,2,3,4,5,6,7]

If I say l[2:6:2], this will give me [3,5].

If you skip the end index, like in your question, it would take elements from the start index (x), pick every yth element until it reaches the end of the list if y is positive and beginning of the list if y is negative.

E.g. l[1::-1] = [2,1]

l[1::2] = [2,4,6]

The default step size is 1.

Answered By: Divya

L[x::y] means a slice of L where the x is the index to start from and y is the step size. Here are some examples you can try in the interpreter

>>> L=range(20)
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

If you want every 3rd element

>>> L[::3]
[0, 3, 6, 9, 12, 15, 18]

Now every third element starting from L[1]

>>> L[1::3]
[1, 4, 7, 10, 13, 16, 19]

Now every third element starting from L[2]

>>> L[2::3]
[2, 5, 8, 11, 14, 17]

You can specify a negative step to go backwards

>>> L[::-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

You can also assign to this slice, but the value must have the same length as the slice you are replacing

>>> L[::3]=[0,0,0,0,0,0,0]
>>> L
[0, 1, 2, 0, 4, 5, 0, 7, 8, 0, 10, 11, 0, 13, 14, 0, 16, 17, 0, 19]

Finally, you can delete every 3rd element like this

>>> del L[::3]
>>> L
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19]
Answered By: John La Rooy
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.