Python 3:获取TypeError:切片必须是整数...但我相信它们

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 3:获取TypeError:切片必须是整数...但我相信它们相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个名为“middle”的函数,它取奇数的中间3位数,或偶数的中间4位数。如果数字小于5位,则只返回整数。这是我的工作:

def middle(x):
    mystring=str(x)
    length=len(mystring)
    if len(mystring)<=5:
        return(x)
    elif len(mystring)%2==0:
        return (mystring[((length/2)-1):((length/2)+3)])
    else:
        return (mystring[(length//2):((length//2)+3)])
middle (1234567890)

我一直得到“类型错误:切片索引必须是整数或没有或有an_index_method”,我不明白。

答案

你打赌,你使用的是Python 3。 [你是 - 我刚才注意到这个标签。] length/2将是一个浮动:

    return (mystring[((length/2)-1):((length/2)+3)])

改为使用length//2

请注意,即使length是偶数,也会发生这种情况:

>>> s = 'abcd'
>>> len(s)
4
>>> len(s)/2
2.0
>>> s[len(s)/2:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method
>>> s[len(s)//2:]
'cd'
另一答案

//运算符仅在分子为int时返回int,而当分子为float时仍返回float。

assert type(2//2) == int
assert type(2.//2) == float

要克服切片中的此限制,可能会使用以下函数:

def intslice(*args, **kwargs):
    '''Return a slice object that has integer boundaries.

    Example:
    np.arange(10)[intslice(10/10,10/2)]
    '''

    args = [int(arg) for arg in args]
    kwargs = {key: int(arg) for key, arg in kwargs.items()}
    return slice(*args, **kwargs)

现在intslice(10/10,10/2)返回slice(1,5)

以上是关于Python 3:获取TypeError:切片必须是整数...但我相信它们的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用字符串作为切片索引? (TypeError:切片索引必须是整数或 None 或具有 __index__ 方法)

如何在不获取“TypeError:字符串索引必须是整数”的情况下对图像进行 numpy 切片

Python:无法替换列表中的项目,原因是:TypeError:列表索引必须是整数或切片,而不是 str

TypeError:列表索引必须是整数或切片,而不是 str

TypeError:列表索引必须是整数或切片,而不是列表

TypeError:列表索引必须是整数或切片,而不是浮点数