我很难理解下面的代码。特别是最后一行。
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'
。
此代码写入上面给出的字符串中找到的子字符串的编号次数。
任何解释都将不胜感激。
答案 0 :(得分:1)
[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
(不包括),如果的子字符串{{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
循环中。
其他步骤并不复杂:
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