Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在字符串中找到子字符串的总次数_Python_String_Loops_For Loop_Substring - Fatal编程技术网

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)]))