显示字符串的中间元素



最近我尝试学习编程,在完成第一个教程后,我正在尝试解决codewars.com上的一些问题。

"你将得到一个单词。你的工作是返回单词的中间字符。如果单词的长度是奇数,则返回中间字符。当单词的长度为偶数时,则返回两个中间字符。">

这是我的解决方案:

def get_middle(n):
if len(n) % 2 == 0:
return n[(len(n)/2) - 1] and n[(len(n)/2)]
else:
return n[(len(n)/2) + 0.5]

不幸的是,当用"abc"执行函数时,我总是得到:

Traceback (most recent call last) <ipython-input-24-46429b2608e5> in <module>
----> 1 print(get_middle("abc"))
<ipython-input-23-56ccbf5e17f7> in get_middle(n)
3         return n[(len(n)/2) - 1] and n[(len(n)/2)]
4     else:
----> 5         return n[(len(n)/2) + 1]
TypeError: string indices must be integers

我不明白为什么我总是犯这种错误。我所有的字符串索引不是整数吗?我知道有很多不同的解决方案,但我真的很想知道为什么我的解决方案没有按照我想要的方式工作

提前感谢!

在Python中,有两种除法:整数除法和浮点除法。

print(4 / 2)
---> 2.0
print(4 // 2)
---> 2

在Python 2中,将一个整数除以另一个整数,得到一个整数。由于Python没有预先声明数据类型,解释器会自动检测类型,因此您永远不知道何时要使用整数,何时要使用浮点。

由于浮点数会失去精度,因此不建议在积分计算中使用浮点数

为了解决这个问题,未来的Python模块包括一种称为整数除法的新型除法,由运算符//给出

现在,/执行-浮点除法,并且//执行-整数除法。

def get_middle(n):
if len(n) % 2 == 0:
return n[(len(n)//2) - 1] and n[(int(len(n)/2))]
else:
return n[int(len(n)/2+ 0.5)]

我们代码的问题是division自动将integer转换为float类型,Python开始抱怨它。简单的解决方案是在division中添加第二个/符号,或者在else的情况下将其转换为integer:

def get_middle(n):
if len(n) % 2 == 0:
return n[(len(n)//2) - 1] and n[(len(n)//2)]
else:
return n[int((len(n)/2) + 0.5)]

试试math.floor:

import math                                                                     

def get_middle(value):                                                          
length = len(value)                                                         
if length % 2 == 0:
# even length, pick the middle 2 characters                                                         
start = length // 2 - 1                                                 
end = length // 2 + 1                                                   
else:
# odd length, pick the middle character                                                                       
start = math.floor(length // 2)                                         
end = start + 1                                                         
return value[start:end]

一个建议是,如果你正在学习编程,试着分解你的步骤,而不是一行完成所有步骤,这在试图理解错误信息时会有很大帮助。

如果用/运算符将奇数整数除以2,则得到浮点值。当这个浮点值用作标记时,应该显式地将其转换为整数。

最新更新