Python索引错误:字符串索引超出范围

时间:2014-03-20 15:57:27

标签: python python-3.x

## A little helper program that capitalizes the first letter of a word
def Cap (s):
    s = s.upper()[0]+s[1:]
    return s 

给我这个错误:

Traceback (most recent call last):
  File "\\prov-dc\students\jadewusi\crack2.py", line 447, in <module>
    sys.exit(main(sys.argv[1:]))
  File "\\prov-dc\students\jadewusi\crack2.py", line 398, in main
    foundit = search_method_3("passwords.txt")
  File "\\prov-dc\students\jadewusi\crack2.py", line 253, in search_method_3
    ourguess_pass = Cap(ourguess_pass)
  File "\\prov-dc\students\jadewusi\crack2.py", line 206, in Cap
    s = s.upper()[0]+s[1:]
IndexError: string index out of range

4 个答案:

答案 0 :(得分:4)

正如其他人已经指出的那样,问题在于您尝试访问空字符串中的项目。您只需使用capitalize

,而不是在实施中添加特殊处理
'hello'.capitalize()
=> 'Hello'
''.capitalize()
=> ''

答案 1 :(得分:3)

它可能会爆炸,因为没有索引空字符串。

>>> ''[0]
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
IndexError: string index out of range

正如已经指出的那样,在一个字母上分割一个字符串以调用str.upper()可以被str.capitalize()取代。

此外,如果您经常遇到一个空字符串传递的情况,您可以通过以下几种方式处理:

…#whatever previous code comes before your function
if my_string:
    Cap(my_string)    #or str.capitalize, or…

if my_string或多或少像if len(my_string) > 0

并且总是你们try/except,但我认为你们首先想要考虑重构:

#your previous code, leading us to here…
try:
    Cap(my_string)
except IndexError:
    pass

我不会保持结婚以索引字符串以在单个字符上调用str.upper(),但您可能有一组独特的原因。但是,在所有条件相同的情况下,str.capitalize()执行相同的功能。

答案 2 :(得分:2)

>>> s = 'macGregor'
>>> s.capitalize()
'Macgregor'
>>> s[:1].upper() + s[1:]
'MacGregor'
>>> s = ''
>>> s[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> s[:1].upper() + s[1:]
''

  

为什么s [1:]不对空字符串保释?

Tutorial on strings说:

  

优雅地处理退化切片索引:也是一个索引   large由字符串大小替换,上限小于   下限返回一个空字符串。

另见Python's slice notation

答案 3 :(得分:0)

当我确定我的字符串不为空时,我遇到了同样的错误。所以我想我会在这里分享这个,所以那些得到错误的人有尽可能多的潜在理由。

就我而言,我声明了一个字符串,而python显然将其视为char类型。当我添加另一个角色时它起作用了。我不知道它为什么不自动转换它,但这可能是导致“IndexError:字符串索引超出范围”的原因,即使您认为假定的字符串不为空。

Python版本可能有所不同,我看到最初的问题是指Python 3.当发生这种情况时我使用了Python 2.6。