假设我有一个变量S
,它的字符串是 "1:3"
(或者是"1"
、"1:"
或":3"
),我想在list L
上使用它作为切片说明符。您不能简单地执行L[S]
,因为切片所需的are是"int:int"
。
现在,我有一些丑陋的代码将S
解析为它的两个组成int
,并处理所有的边缘情况(其中4个),以获得正确的切片访问,但这是非常丑陋和非unpythonic的。
我如何优雅地接受字符串S
并使用它作为我的切片说明符?
发布于 2012-11-10 10:14:39
这是另一个解决方案
eval("L[%s]" % S)
警告-如果S来自外部(不可靠)源,则为http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html。
发布于 2012-11-10 10:04:05
这可以通过使用列表理解来完成,而不需要进行大量的黑客操作。我们在:
上拆分字符串,将拆分的项作为参数传递给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]
https://stackoverflow.com/questions/13324554
复制相似问题