4

假设我有一个S带有字符串 "1:3"的变量(或者就此而言,"1", or "1:"or ":3"),并且我想将它用作list L上的切片说明符。您不能简单地这样做,L[S]因为切片所需的参数是"int:int".

现在,我目前有一些丑陋的代码可以解析S为它的两个组成部分int,并处理所有边缘情况(其中 4 个)以提出正确的切片访问,但这只是丑陋且不符合 Python 标准。

如何优雅地获取字符串S并将其用作我的切片说明符?

4

2 回答 2

5

这可以通过使用列表理解来完成,而无需太多黑客攻击。我们在 上拆分字符串:,将拆分项作为参数传递给slice()内置函数。这使我们能够很好地在一行中生成切片,以一种适用于我能想到的每种情况的方式:

slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])

通过使用slice()内置函数,我们巧妙地避免了自己处理太多的边缘情况。

示例用法:

>>> some_list = [1, 2, 3]
>>> string_slice = ":2"
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
[1, 2]
>>> string_slice = "::-1"
>>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
[3, 2, 1]
于 2012-11-10T18:04:05.303 回答
1

这是另一个解决方案

eval("L[%s]" % S) 

警告 -如果 S 来自外部(不可靠)来源,则不安全。

于 2012-11-10T18:14:39.380 回答