我正在尝试将字符串的最后一个字符存储在变量中,而不事先知道该字符串的长度(该字符串最初是从列表中读取的)。我有:
last = record[-1]
lastInd = len(last) - 1
lastChar = last[lastInd]
但是我收到以下错误:
lastChar = last[lastInd]
IndexError: string index out of range
如果我尝试:
lastChar = last[-1]
我得到同样的错误:
lastChar = last[-1]
IndexError: string index out of range
我真的不明白这里出了什么问题?我没有把索引搞定吗?
答案 0 :(得分:5)
正如inspectorG4dget所说,从last[-1]
获取此异常的唯一方法是last
是否为空字符串。
如果你想知道如何处理它......那么,这取决于你想要做什么。
通常情况下,如果你想要获取字符串的最后一个字符,你希望它是非空的,所以如果意外地为空,应该是一个错误。
但是如果你想得到最后一个字符,如果字符串是空的,或者是一个空字符串,如果它是,有三种方法可以做到,在(我认为是)pythonic-ness的下降顺序,at至少在新手编写的代码中。
首先,EAFP(“请求宽恕而不是权限更容易。)假设它可以正常工作,try
,并在适当时处理意外故障:
try:
lastChar = last[-1]
except IndexError:
lastChar = ''
然后是LBYL(在你跳跃之前看)。提前检查意外情况:
if last:
lastChar = last[-1]
else:
lastChar = ''
最后,过于聪明。编写三个月后你将无法理解的代码而不考虑它:
lastChar = last[-1:]
这将返回从最后一个到结尾的所有字符。如果有任何字符,则与最后一个字符相同。如果没有人物,那就没什么了。
请注意,这只能按预期工作,因为字符串的各个元素本身就是字符串。如果你试图从这样的列表中获取最后一个元素,你将获得一个包含1个元素或空列表的列表,而不是一个可能的空元素。
答案 1 :(得分:3)
这是因为last
是一个空字符串。
检查出来:
>>> last = 'a'
>>> last[-1]
'a'
>>> last = ''
>>> last[-1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
如果你想要一个空字符串作为你的最后一个字符,以防万一你有一个空字符串作为你的最后一个记录,那么你可以试试这个:
if last == '': # or `if not last`
lastChar = ''
或者,您可以使用三元运算符:
lastChar = last[-1] if last else ''