Slicing a list using a variable, in Python

PythonListSlice

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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

Solution 2 - Python

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.

Solution 3 - Python

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]

Solution 4 - Python

>>> a=range(10)
>>> i=[2,3,4]

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

>>> list(a[i[0]:i[-1]])
[2, 3]

Solution 5 - Python

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrobintwView Question on Stackoverflow
Solution 1 - PythonmataView Answer on Stackoverflow
Solution 2 - PythonMark ByersView Answer on Stackoverflow
Solution 3 - PythonLevonView Answer on Stackoverflow
Solution 4 - PythonAshwini ChaudharyView Answer on Stackoverflow
Solution 5 - PythongrobberView Answer on Stackoverflow