我正在尝试编写一个名为“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”而且我不明白。
答案 0 :(得分:13)
我正在使用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'
答案 1 :(得分:0)
//
运算符仅在分子为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)