我试图这样做,以便当有人输入他们的名字时,如果程序没有以"(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'
的其他错误代码,有人可以解释一下原因吗?
答案 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)
不要将this与calling 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)