给出一个清单
a = range(10)
您可以使用
等语句对其进行切片a[1]
a[2:4]
但是,我想基于代码中其他地方设置的变量来执行此操作。我可以轻松地为第一个做这个
i = 1
a[i]
但我如何为另一个做这个呢?我尝试使用列表编制索引:
i = [2, 3, 4]
a[i]
但这不起作用。我也尝试过使用字符串:
i = "2:4"
a[i]
但这也不起作用。
这可能吗?
答案 0 :(得分:67)
答案 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
插在括号内。因为它只是按原样插入包含冒号的字符串,所以它可以精确地处理通常的用冒号分隔的切片语法。