在Python中使用变量切片列表

时间:2012-05-13 16:52:02

标签: python list slice

给出一个清单

a = range(10)

您可以使用

等语句对其进行切片
a[1]
a[2:4]

但是,我想基于代码中其他地方设置的变量来执行此操作。我可以轻松地为第一个做这个

i = 1
a[i]

但我如何为另一个做这个呢?我尝试使用列表编制索引:

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

但这不起作用。我也尝试过使用字符串:

i = "2:4"
a[i]

但这也不起作用。

这可能吗?

5 个答案:

答案 0 :(得分:67)

这是slice()的用途:

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

这与使用a[2:4]相同。

答案 1 :(得分:9)

为什么它必须是一个变量?只需使用两个变量:

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

如果真的需要是一个变量,你可以使用一个元组。

答案 2 :(得分:2)

使用下面的分配,您仍然使用您显示的相同类型的切片操作,但现在使用值的变量。

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

然后

print a[i:j]
[2, 3]

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

我最近遇到了这个问题,同时探讨了如何让用户通过命令行中传递的参数来模仿a:b:c::c等的常规切片语法。

该参数被读取为字符串,因此我不希望在':'上拆分,而应将其传递给slice(),依此类推。此外,如果用户传递的是 single 整数i,其预期含义显然是a[i]。不过,slice(i)将默认设置为slice(None,i,None),这不是理想的结果。

无论如何,我能想到的最直接的解决方案是将字符串读为变量st,然后将所需的列表切片恢复为eval(f"a[{st}]")

这使用内置的eval()f-string,其中st插在括号内。因为它只是按原样插入包含冒号的字符串,所以它可以精确地处理通常的用冒号分隔的切片语法。