2012-11-10 45 views
4

假设我有一个变量S字符串"1:3"(或就此而言,"1",或"1:"":3"),我想使用,作为对切片符列表L。你不能简单地做L[S],因为一个切片所需的参数是"int:int"。现在的Python:想用一个字符串作为切片符

,我现在有一些丑陋的代码解析S到它的两个组成int S和处理所有边缘案件(其中4)要拿出正确的片段中的存取,但是这仅仅是丑陋和unpythonic。

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

回答

1

这里的另一种解决方案

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

警告 - 如果It's not safe S从外部(不可靠)源到来。

+0

您可能想要解释*为什么这是一个糟糕的主意(它肯定是)。 –

+0

好的..做了一个编辑。 – vivek

+0

非常好,简洁! – staggart

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] 
+0

更好地使用分割在这里的分区,因为我没有考虑到第三个参数。 – sberry

+0

事实上,它的工作很好。这一个也很好地给你不正确的输入错误(通过抱怨额外的操作数到slice())。 –

+0

非常酷 - 谢谢! – staggart