我无法理解为什么我的find()工作/不工作。我试图计算'sas'的重叠子字符串'这第一个代码块工作并打印出3,我想要的结果。
x = 'sasidsasas'
sasnum = 0
iteration = 0
while True:
iteration = x.find('sas', iteration)
if iteration >= 0:
iteration += 1
sasnum += 1
else:
break
print(sasnum)
第二段代码不起作用(即打印出0)。
x = 'sasidsasas'
sasnum = 0
iteration = 0
while True:
iteration = x.find('sas', len(x))
if iteration >= 0:
iteration += 1
sasnum += 1
else:
break
print(sasnum)
显然,我的问题围绕着find的第二部分。()。现在我相信在第一个代码块中发生的事情是,迭代值被设置为它找到的'sas'的开头加1,因此当它循环回来时它开始寻找下一个'sas'在字符串中。在第二个代码块中,我告诉它开始查看字符串的结尾,因此它会立即爆发。
这是正确的还是我认为这完全错了?
答案 0 :(得分:1)
来自find
的文档:
返回s中找到子字符串sub的最低索引,使得sub完全包含在s [start:end]中。失败时返回-1。
解决问题的第一部分:
现在我相信在第一个代码块中发生的事情是,迭代值被设置为“sas'的开头”。它找到加1,因此当它循环回来时,它开始寻找下一个“sas'在字符串中。
那是对的。这里发生了什么:
在第一次迭代find
返回0,您将其分配给iteration
并递增为1.
在下一次迭代中,find
会考虑子字符串' asidsasas' (x[1:]
),并将{5}分配给iteration
(x
中的下一个' sas'),增加到6。
在第三次迭代中,find
认为子字符串' asas' (x[6:]
)并在索引7处找到第三次出现的子字符串。这将被分配给iteration
,然后增加到8。
在第四次迭代中,find
无法再找到任何出现次数,因此返回-1导致while循环退出。
解决问题的第二部分:
在第二段代码中,我告诉它开始查看字符串的结尾,因此它会立即爆发。
第二个区块中发生的事情是,您要告诉开始查看字符串末尾的索引。这导致x.find
返回-1(失败)。因为-1不大于或等于0,所以sasnum
不会增加,并且会立即退出循环。
所以是的,你也是对的。