2014-07-11 123 views
0

好的。所以,我大概是这个星球上最愚蠢的人,但谁能告诉我,为什么这给了我一个错误(该计划是使用分搜索字符的按字母顺序排列的字符串搜索字符):python字符串索引超出范围

def isInIter(char, aStr): 
    print('char :'+char) 
    print('aStr :'+aStr) 
    isin = False 
    while(len(aStr) > 0): 
    if aStr[len(aStr)/2] == char: 
     isin = True 
     break 
    else: 
     if aStr[len(aStr)/2] > char: 
     aStr = aStr[0 : len(aStr)/2] 
     continue 
     if aStr[len(aStr)/2] < char: 
     aStr = aStr[(len(aStr)/2 + 1) :] 
     continue 
return isin 

错误:

isInIter('d','cddfggjkkqtwyy') 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-66-1de0eb4793fd> in <module>() 
----> 1 isInIter('d','cddfggjkkqtwyy') 

/home/user/Study/Ex/lec5_BisectionSearch.py in isInIter(char, aStr) 
     5 isin = False 
     6 while(len(aStr) > 0): 
----> 7  if aStr[len(aStr)/2] == char: 
     8  isin = True 
     9  break 

IndexError: string index out of range 

但这按预期工作:

char = raw_input('char :') 
aStr = raw_input('aStr :') 

isin = False 
while(len(aStr) > 0): 
if aStr[len(aStr)/2] == char: 
    isin = True 
    break 
else: 
    if aStr[len(aStr)/2] > char: 
    aStr = aStr[0 : len(aStr)/2] 
    continue 
    if aStr[len(aStr)/2] < char: 
    aStr = aStr[len(aStr)/2 + 1 :] 
    continue 

print isin 

我感谢你的帮助。

+3

你可以直接搜索没有循环它。 Python提供了'in'关键字,可以帮助你搜索一个项目。您可以在单个语句中使用“if char in string”,它告诉您字符串是否存在于字符串中。 – user2109788

+1

isInIter('d','cddfggjkkqtwyy')不会给我错误吗?和正常工作? – myildirim

+0

看起来像一个非常糟糕的方式来搜索一个字符,但你的代码在我的机器上运行得很好 – adil

回答

1

当python经过一个while循环时,它会一直等到循环结束以检查退出条件。如果你压缩你的功能可能会更容易:

def isItIn(streen,carroter): 
    while len(streen)>0: 
    if streen[len(streen)/2]==carroter: 
     return True 
    if streen[len(streen)/2]>carroter: 
     streen=streen[0:len(streen)/2] 
    if len(streen)==0:return False 
    if streen[len(streen)/2]<carroter: 
     streen=streen[len(streen)/2+1:] 

print isItIn('asdilk','a') 
print isItIn('kdsoe','a') 
0

为什么不使用str.index(sub\[, start\[, end\]\])?你可以打赌它有一个优化的实现。

In [1]: s = "cddfggjkkqtwyy" 

In [2]: s.index("d") 
Out[2]: 1 

In [3]: s.index("d") > -1 
Out[3]: True