我正在尝试制作一个程序,该程序采用按字母顺序排列的字符串,并通过将字符串分成两部分来查找该字符串中的特定字符,以找到中间的字符,要么比中间字符少一半,要么比中间字符大一半。
我尝试了以下代码并得到错误:
cannot concatenate 'str' and 'int' objects.|
我正在尝试将字符串切成两半,然后将正确的一半返回给程序以再次查找字符。例如,如果字符小于中间字符,我们应该扔掉右半部分,返回左半部分,然后找到中间部分。下面是程序挂起的代码示例:有人可以告诉我为什么吗? return isInF(char, aStr[:middle])
def isIn(char, aStr):
def toChars(aStr):
s = aStr.lower()
ans = ''
for c in s:
if c in 'abcdefghijklmnopqrstuvwxyz':
ans = ans + c
return ans
def isInF(aStr):
if len(aStr) == 0:
return False
elif len(aStr) == 1:
if char == aStr:
return True
else:
return False
elif len(aStr)> 1:
length = len(aStr)
middle = aStr[((length-1)/2)]
if char == middle:
return True
elif char < middle:
return isInF(char, aStr[:middle])
elif char > middle:
return isInF(char, aStr[middle+1:])
return isInF(toChars(aStr))
isIn ('c', 'aaaabbbbc')
为什么不简单地这样做呢?
char in aStr
您发布的代码存在一些问题,例如isInF(char, aStr[middle])
,但isInF
只需要一个参数。 但是,看起来问题出在:
...
middle = aStr[((length-1)/2)]
...
return isInF(char, aStr[middle+1:])
middle
从aStr
中间返回一个字符,并且是一个字符串。 然后,您尝试向其添加1
,这显然失败了。 我怀疑你的意思是middle
字符串中间的位置而不是中间的字符,所以那行应该读作:
middle = (length-1) / 2
这是您的代码的工作版本:
def isIn(char, aStr):
def toChars(aStr):
s = aStr.lower()
ans = ''
for c in s:
if c in 'abcdefghijklmnopqrstuvwxyz':
ans = ans + c
return ans
def isInF(aStr):
length = len(aStr) # call len() once will ok
if length == 0:
return False
elif length == 1:
if char == aStr:
return True
else:
return False
elif length > 1:
middle = (length-1)/2
try:
if char == aStr[middle]:
return True
elif char < aStr[middle]:
return isIn(char, aStr[:middle])
elif char > aStr[middle]:
# print aStr[:middle]
return isIn(char, aStr[middle+1:])
except Exception, error:
print error
return isInF(toChars(aStr))
print isIn ('c', 'aaaabbbbc')
你的错误在这里
middle = aStr[((length-1)/2)]
中间是一个字符,因为你用中间索引aStr,但在这里:
isInF(char, aStr[:middle])
你再次用中间索引 aStr,但它是一个字符,所以你得到错误。
这是我的代码返工版本:
import string
def isIn(char, aStr):
def toChars(aStr):
lower_str = aStr.lower()
return ''.join([i for i in aStr if i in string.lowercase])
def isInF(aStr):
length = len(aStr) # call len() once will ok
if length == 0:
return False
elif length == 1:
return True if char == aStr else False
elif length > 1:
middle = (length-1)/2
if char == aStr[middle]:
return True
elif char < aStr[middle]:
return isIn(char, aStr[:middle])
elif char > aStr[middle]:
return isIn(char, aStr[middle+1:])
return isInF(toChars(aStr))
print isIn('c','abcdef')
print isIn('x','abcdef')