Python 在字符串中找到子字符串的总次数
我很难理解下面的代码。。尤其是最后一行Python 在字符串中找到子字符串的总次数,python,string,loops,for-loop,substring,Python,String,Loops,For Loop,Substring,我很难理解下面的代码。。尤其是最后一行 string = "abcdcdc" sub_string = "cdc" print(sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)])) 代码的输出是'2' 此代码写入在上述字符串中找到的子字符串的次数 任何解释都将不胜感激。如果您查看for循环生成的值列表,您将发现它创建了
string = "abcdcdc"
sub_string = "cdc"
print(sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]))
代码的输出是'2'
此代码写入在上述字符串中找到的子字符串的次数
任何解释都将不胜感激。如果您查看for循环生成的值列表,您将发现它创建了以下列表:
print([string[i:(len(sub_string) + i)] for i in range(0, len(string) - len(sub_string) + 1)])
['abc', 'bcd', 'cdc', 'dcd', 'cdc']
该列表包含您搜索两次的子字符串,这是您获得的结果。代码在字符串索引上循环,从“string”的开头到结尾减去子字符串中的元素数 如果字符串的下3个元素与子字符串相同,则[]将包含一个列表,其中1为wrtitten sum()返回列表的和。由于每次找到sub_字符串时都包含1,因此这将统计字符串中sub_字符串的出现次数
[1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]
表示循环i
,范围从0
到len(string)-len(sub_string)+1
(不包括)和如果索引i
处的string
的子字符串,长度为sub_string
(即,到索引(len(sub_string)+i)
)等于sub_string
然后将1
和收集它们作为列表,即结果是[1,1]
,因为substring
是string
的两倍子字符串
有关更多详细信息,请参阅
sum([1代表范围(0,len(string)-len(sub_string)+1)中的i,如果(string[i:(len(sub_string)+i)]==sub_string)])
它只是对上面描述的列表求和,sum([1,1])
等于它的python,所以你必须向后读,“如果字符串包含子字符串,尝试查找子字符串出现的次数。”我这样写:
'abcdcdc'.count('cdc')
这是一个所谓的,有这种语法,这就是为什么它看起来像是一个if
,而在for
循环中没有可见的结果
除此之外,步骤并不复杂:
- 我们需要大字符串中的所有3个字符的子序列,
范围(0,len(string)-len(sub_string)+1)
部分准备这些的起始索引,7-3+1=5,因此范围将从0…4运行。您可以在交互式shell中检查它,它将显示范围(0,5)
- 然后
[]
东西创建一个列表,您也可以检查:[1对于范围(0,5)中的i)]
将创建[1,1,1,1]
- 但是您想将事情与
if
部分进行比较。首先,您可以检查子字符串,而不是1
,编写子字符串内容:[string[i:(len(sub_string)+i)],因为i在范围(0,5)]
,正如Karl Graham所建议的,并导致['abc',bcd',cdc',dcd',cdc']
,然后您可以使用完整的比较,[string[i:(len sub string)+i:(sub u string)+i)]==范围(0,5)内i的子字符串
,它产生[假,假,真,假,真]
- 事实上,您已经可以
sum
这个了,sum([string[i:(len(sub_string)+i)]==sub_string for i in range(0,5)])
将输出2,因为True
计为1,False
计为0。就在这里,创建此代码的人决定输出实际数字,并使用可选的if
子句来理解列表,创建一个1-s的列表,但仅用于两个匹配位置:[1表示范围内的i(0,len(string)-len(sub_string)+1)if(string[i:(len(sub_string)+i)]==sub string)]
显示[1,1]
- 和
sum
将这些1-s相加,得到2
作为Python代码段或在笔记本中运行的摘要代码(如):
因为'cdc'
出现在'abcdcdc'
中两次?请您解释一下。因为这就是我要找的。@Farhan.K,请停止屈尊俯就。问题很清楚:用户想要的是对代码的解释,而不是结果。这是一个好问题+1。@jpp这不是在编辑之前。谢谢你的回答。它真的帮助我理解了代码。
string = "abcdcdc"
sub_string = "cdc"
print(len(string))
print(len(sub_string))
print(range(0,len(string)-len(sub_string)+1))
print([1 for i in range(0,5)])
print([string[i:(len(sub_string) + i)] for i in range(0,5)])
print([string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)])
print(sum([string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)]))
print([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)])
print(sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]))