我正在尝试理解 为什么 以下python代码错误地返回字符串“dining”:
def remove(somestring, sub):
"""Return somestring with sub removed."""
location = somestring.find(sub)
length = len(sub)
part_before = somestring[:location]
part_after = somestring[location + length:]
return part_before + part_after
print remove('ding', 'do')
我意识到使代码正确运行的方法是添加一个if语句,这样如果位置变量返回-1,它将只返回原始字符串(在本例中为“ding”)。例如,代码应为:
def remove(somestring, sub):
"""Return somestring with sub removed."""
location = somestring.find(sub)
if location == -1:
return somestring
length = len(sub)
part_before = somestring[:location]
part_after = somestring[location + length:]
return part_before + part_after
print remove('ding', 'do')
不使用if语句来修复函数,part_before变量将返回字符串“din”。我很想知道为什么会这样。阅读string.find上的python文档(最终是如何制定part_before)我看到位置变量将变为-1,因为找不到“do”。但是如果part_before变量在-1索引之前保存所有字母,那么它不应该是空白而不是“din”吗?我在这里缺少什么?
作为参考,string.find的Python文档说明:
string.find(s, sub[, start[, end]])
返回s中找到子字符串sub的最低索引,使得sub完全包含在s [start:end]中。失败时返回-1。开始和结束的默认值以及负值的解释与切片相同。
答案 0 :(得分:3)
string = 'ding'
string[:-1]
>>> 'din'
在python中使用负数作为索引返回右侧的 n 元素。因此,具有:-1
的切片将返回除字符串的最后一个元素之外的所有元素。
答案 1 :(得分:1)
如果您有一个字符串'ding'
并且您正在搜索'do'
,则str.find()
将返回-1。 'ding'[:-1]
等于'din'
,'ding'[-1 + len(sub):]
等于'ding'[1:]
,等于'ing'
。将两者结合在一起可以实现“用餐”。要获得正确答案,请尝试以下方法:
def remove(string, sub):
index = string.find(sub)
if index == -1:
return string
else:
return string[:index] + string[index + len(sub):]
string[:-1]
不等于整个字符串的原因是在切片时,第一个数字(在这种情况下空白等于None
,或者我们的目的等于0)是包容性的,但第二个数字(-1)是独占的。 string[-1]
是最后一个字符,因此不包含该字符。