Python - 如何获取切片的索引值

6

是否可以获取切片的索引值(起始位置,终止位置)? 例如:

In [1]: s = "Test string"
In [2]: s[-6:] # get slice indexes (5,11)
Out[2]: 'string'


In [3]: s = "Another test string"
In [4]: s[8:] # get slice indexes (8,19)
Out[4]: 'test string'

换句话说,我不需要子字符串本身,只需要作为元组(起始位置,结束位置)的索引。

2
len(s) - 6, len(s)8, len(s)是你想要的。我不太确定你需要什么 - 你为什么需要这些? - Eric
3个回答

16
您可以像这样使用Python的slice对象:
In [23]: s = "Test string"

In [24]: slice(-6, None).indices(len(s))
Out[24]: (5, 11, 1)

In [25]: s = "Another test string"

In [26]: slice(8, None).indices(len(s))
Out[26]: (8, 19, 1)

编辑:使用Eric的改进,将停止参数改为None而不是len(s)


1
你可以在这里使用 None 作为 stop 参数,而不是 len(s) - Eric

3
class SliceGetter(object):
    def __init__(self, inner):
        self.size = len(inner)

    def __getitem__(self, index):
        return index.indices(self.size)[:2]

>>> SliceGetter("Test string")[-6:]
(5, 11)
>>> SliceGetter("Another test string")[8:]
(8, 19)

这有点重复造轮子。 - Gareth Latty
@Lattyware:并不是真的 - 它只是允许您使用语法糖来创建切片对象。 - Eric
我明白了,这是个很酷的小想法,但我不认为它真的能使代码更清晰,而且内置的 slice() 已经可以胜任。 - Gareth Latty

0

定义你自己的函数:

In [119]: def start_end(strs,x):
    if x>0:
        return x,len(strs)  
    else:
        return len(strs)+x,len(strs)
   .....:     

In [120]: start_end("Test String",-6)
Out[120]: (5, 11)

In [122]: func("Another test string",8)
Out[122]: (8, 19)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接