" IndexError:列表索引超出范围"试图让名字占有欲

时间:2016-05-21 14:39:38

标签: python list if-statement

我试图这样做,以便当有人输入他们的名字时,如果程序没有以"(name)'s"结尾,程序将添加s,如果有"(name)'",则name = list(input("What is your name?")) name2 = int(len(name)) if name[name2] == "s": name[name2] = "s'" else: name[name2] = name(name2) , "'s" print("".join(name)) 确实:

What is your name?James
Traceback (most recent call last):
  File "C:\Users\James\Desktop\Python\lists i guess.py", line 5, in <module>
    if name[name2] == "s":
IndexError: list index out of range

以下错误代码:

" () "

错误代码结束。

顺便说一下,我在{/ 1}}上更改了" [] "

if name[name2] == "s":
    name[name2] = "s'"

它似乎停止显示'cannot assign function'的其他错误代码,有人可以解释一下原因吗?

2 个答案:

答案 0 :(得分:3)

Python列表的索引从0 开始。这意味着列表中的 last 元素始终具有索引len(listobject) - 1

您正在尝试使用len(listobject),因此您尝试访问永远不会出现在列表中的索引。

只需使用-1作为索引。负指数从结尾开始计算,-1是最后一个元素,-2是倒数第二个,等等。

此外,字符串已经是序列,您不需要将这些字符串转换为列表来测试元素。只需使用连接即可添加其他文本; name + "'"name + "'s"

以下内容可用于将"'s""'"添加到结尾:

name = input("What is your name?")

if name[-1] == 's':
    name += "'"  # only add an apostrophe
else:
    name += "'s"

print(name)

不要将thiscalling an object with (...)混淆;从序列中获取特定元素是通过订阅完成的,同时使函数执行某些操作并返回结果是通过调用完成的。

因为您无法分配函数调用的结果,所以表达式name(name2)不能用作=赋值的目标,这就是您获得的原因你的错误。但是可以分配给列表的特定元素,这就是name[name2] = <something> 工作的原因。

答案 1 :(得分:1)

你对Python中字符串的工作方式做了一些错误的假设。

您获得IndexError,因为Python对其迭代使用从零开始的索引,因此some_list[len(some_list)]将始终返回IndexError

即使它确实有效,name[name2] = name(name2) , "'s"也没有按照您的预期行事。

以下是使用您的方法更正的代码:

name = list(input("What is your name?"))
name2 = int(len(name))

if name[name2 - 1] == "s":
    name[name2 - 1] = "s'" 
else:
    name[name2 - 1] = name[name2 - 1] + "'s"
print("".join(name))

但是这里有另一种更多的Pythonic方法,而不是将字符串转换为字符列表:

name = input("What is your name?")

if name.endswith("s"):
    name += "'" 
else:
    name += "'s"
print(name)