Slicing a list using a variable, in Python

Question:

Given a list

a = range(10)

You can slice it using statements such as

a[1]
a[2:4]

However, I want to do this based on a variable set elsewhere in the code. I can easily do this for the first one

i = 1
a[i]

But how do I do this for the other one? I’ve tried indexing with a list:

i = [2, 3, 4]
a[i]

But that doesn’t work. I’ve also tried using a string:

i = "2:4"
a[i]

But that doesn’t work either.

Is this possible?

Asked By: robintw

||

Answers:

Why does it have to be a single variable? Just use two variables:

i, j = 2, 4
a[i:j]

If it really needs to be a single variable you could use a tuple.

Answered By: Mark Byers

With the assignments below you are still using the same type of slicing operations you show, but now with variables for the values.

a = range(10)
i = 2
j = 4

then

print a[i:j]
[2, 3]
Answered By: Levon

that’s what slice() is for:

a = range(10)
s = slice(2,4)
print a[s]

That’s the same as using a[2:4].

Answered By: mata
>>> a=range(10)
>>> i=[2,3,4]

>>> a[i[0]:i[-1]]
range(2, 4)

>>> list(a[i[0]:i[-1]])
[2, 3]
Answered By: Ashwini Chaudhary

I ran across this recently, while looking up how to have the user mimic the usual slice syntax of a:b:c, ::c, etc. via arguments passed on the command line.

The argument is read as a string, and I’d rather not split on ':', pass that to slice(), etc. Besides, if the user passes a single integer i, the intended meaning is clearly a[i]. Nevertheless, slice(i) will default to slice(None,i,None), which isn’t the desired result.

In any case, the most straightforward solution I could come up with was to read in the string as a variable st say, and then recover the desired list slice as eval(f"a[{st}]").

This uses the eval() builtin and an f-string where st is interpolated inside the braces. It handles precisely the usual colon-separated slicing syntax, since it just plugs in that colon-containing string as-is.

Answered By: grobber
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.