54

给定一个列表

a = range(10)

您可以使用以下语句对其进行切片

a[1]
a[2:4]

但是,我想根据代码中其他地方设置的变量来执行此操作。我可以很容易地为第一个做到这一点

i = 1
a[i]

但是我该怎么做呢?我尝试使用列表进行索引:

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

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

i = "2:4"
a[i]

但这也行不通。

这可能吗?

4

5 回答 5

111

slice()就是:

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

这与使用a[2:4].

于 2012-05-13T16:56:48.937 回答
11

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

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

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

于 2012-05-13T16:53:28.220 回答
3

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

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

然后

print a[i:j]
[2, 3]
于 2012-05-13T16:56:36.933 回答
2
>>> a=range(10)
>>> i=[2,3,4]

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

>>> list(a[i[0]:i[-1]])
[2, 3]
于 2012-05-13T17:02:47.947 回答
2

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

该参数被读取为字符串,我宁愿不拆分':',将其传递给slice()等。此外,如果用户传递单个整数i,则预期含义很明显a[i]。然而,slice(i)将默认为slice(None,i,None),这不是所需的结果。

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

这使用了eval()内置函数和一个在大括号内插值的f 字符串。st它精确地处理通常的以冒号分隔的切片语法,因为它只是按原样插入包含冒号的字符串。

于 2020-02-29T03:49:35.223 回答