假设我有一个变量S
与字符串"1:3"
(或就此而言,"1"
,或"1:"
或":3"
),我想使用,作为对切片符列表L
。你不能简单地做L[S]
,因为一个切片所需的参数是"int:int"
。现在的Python:想用一个字符串作为切片符
,我现在有一些丑陋的代码解析S
到它的两个组成int
S和处理所有边缘案件(其中4)要拿出正确的片段中的存取,但是这仅仅是丑陋和unpythonic。
如何优雅地采取字符串S
并将其用作我的切片说明符?
假设我有一个变量S
与字符串"1:3"
(或就此而言,"1"
,或"1:"
或":3"
),我想使用,作为对切片符列表L
。你不能简单地做L[S]
,因为一个切片所需的参数是"int:int"
。现在的Python:想用一个字符串作为切片符
,我现在有一些丑陋的代码解析S
到它的两个组成int
S和处理所有边缘案件(其中4)要拿出正确的片段中的存取,但是这仅仅是丑陋和unpythonic。
如何优雅地采取字符串S
并将其用作我的切片说明符?
这可以通过使用列表理解来避免太多黑客攻击。我们将字符串拆分为:
,将拆分项作为参数传递给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]
您可能想要解释*为什么这是一个糟糕的主意(它肯定是)。 –
好的..做了一个编辑。 – vivek
非常好,简洁! – staggart