可以在字符串中找到子字符串的总次数

时间:2018-02-20 12:04:49

标签: 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'

此代码写入上面给出的字符串中找到的子字符串的编号次数。

任何解释都将不胜感激。

5 个答案:

答案 0 :(得分:1)

[1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]

表示循环 i,范围从0len(string) - len(sub_string) + 1(不包括),如果的子字符串{{1在索引string且长度为i(即最高索引sub_string)等于(len(sub_string) + i) ,然后 sub_string收集它们作为列表,即结果为1,因为[1, 1]substring的子字符串两次。

有关详细信息,请参阅Python List Comprehension

string

它只是总结了上述列表,sum([1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)])等于sum([1, 1])

答案 1 :(得分:0)

如果您查看for循环生成的值列表,您会发现它创建了以下列表:

print([string[i:(len(sub_string) + i)] for i in range(0, len(string) - len(sub_string) + 1)])
['abc', 'bcd', 'cdc', 'dcd', 'cdc']

该列表包含您要搜索两次的子字符串,这是您获得的结果。

答案 2 :(得分:0)

代码从"字符串"的开头循环遍历字符串索引。到最后减去子环中的元素数量。

如果字符串的后3个元素与sub_string相同,则[]创建一个列表并且在那里有一个字符。

sum()返回列表的总和。由于每次找到sub_string时都包含1,这会计算字符串

中sub_string的出现次数

答案 3 :(得分:0)

它的python所以你必须向后读它,'如果string包含子字符串,尝试查找子字符串出现次数。'我这样写:

 'abcdcdc'.count('cdc')

答案 4 :(得分:0)

这是一个所谓的list comprehension,它具有这种语法,这就是为什么它看起来像if而没有可见的结果放在for循环中。

其他步骤并不复杂:

  • 我们需要来自大字符串的所有3个字符的子序列,range(0, len(string) - len(sub_string) + 1)部分为那些准备起始索引,7-3 + 1 = 5,因此范围将从0 ... 4开始。您可以在交互式shell中进行检查,它会显示range(0,5)
  • 然后[]会创建一个列表,您也可以检查它:[1 for i in range(0,5)]将创建[1,1,1,1,1]
  • 但您希望与if部分进行比较。首先你可以检查子串,而不是1,写下子串的东西:[string[i:(len(sub_string) + i)] for i in range(0,5)],正如Karl Graham所建议的那样产生['abc', 'bcd', 'cdc', 'dcd', 'cdc'],那么你可以使用完整的比较,{{1 }},生成[string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)]
  • 实际上你已经[False, False, True, False, True]了,sum会输出2,因为sum([string[i:(len(sub_string) + i)]==sub_string for i in range(0,5)])被计为1而True被视为0.就在这里创建此代码的人,决定输出实际数字并使用可选的False子句进行列表理解,创建1-s列表,但仅限于两个匹配位置:if显示[1 for i in range(0, len(string) - len(sub_string) + 1) if (string[i:(len(sub_string) + i)] == sub_string)]
  • [1,1]将这些1-s加在一起,产生2。

作为Python代码段或在笔记本中运行的摘要代码(如here):

sum