2017-06-15 79 views
0

我一直在解决这个问题几个小时,现在我似乎无法得到它。我的逻辑与这一个是如此关闭Python字符串切片示例集

目的是根据问题所期望的输出来确定单词“bob”出现的次数= 2。

我只是不知道如何去那里。我得到了:

s = 'azcbobobegghakl' 
bob = 0 
for i in range(len(s)): 
    print(s[i: i+3]) 
print("Number of times bob occurs is: ", bob) 

如果有人回答这个问题,请向我解释你是如何得到答案的。在此先感谢

+2

你需要比较'S [I:+ 3]''给 “鲍勃”'如果等于增加你的'bob'计数。 – AChampion

回答

0

请检查代码。

s = 'azcbobobegghakl' 
bob = 0 
for i in range(len(s)): 
    print(s[i: i+3]) 
    if s[i: i+3] == "bob": 
     bob += 1 
print("Number of times bob occurs is: ", bob) 

的输出,

azc 
zcb 
cbo 
bob 
obo 
bob 
obe 
beg 
egg 
ggh 
gha 
hak 
akl 
kl 
l 
Number of times bob occurs is: 2 
0

下面的代码片断使用正则表达式库re找到非重叠的子串,并返回找到的列表中的所有实例。列表中的len()是发生的次数。

import re 
number_of_bob = len(re.findall("bob", "azcbobobegghakl")) 

此方法不适用于重叠模式。在一行中查找重叠子串的数量:

number_of_bob = sum(1 for i in range(len(s)-2) if s[i:i+3] == 'bob') 
+0

其实findall只发现*非重叠*匹配 - 因此您的代码将返回1,而不是2. –

+0

虽然此代码可能会回答问题,但提供有关为何和/或代码如何回答此问题的其他上下文会提高其长期值。 –

+0

@Donald Duck答案更正了,谢谢。 – Muposat

0

您的答案实际上很简单。你解决了一半的问题。你通过三重迭代你的字符串。你需要做的就是测试这些子字符串是否与字符串"bob"相等。如果是这样,通过1递增bob计数器:

>>> s = 'azcbobobegghakl' 
>>> bob = 0 
>>> 
>>> for i in range(len(s)): 
    substr = s[i: i + 3] 
    # is the current three letter substring equal to "bob"? 
    if substr == 'bob': 
     # if so, increment the counter by one. 
     bob += 1 


>>> bob 
2 
>>> 
0

这里有一个1班轮使用列表理解。

s = 'azcbobobegghakl' 
count = [s[i : i + 3] for i in range(len(s))].count('bob') 

print("Number of times bob occurs is: ", count) 

打印

Number of times bob occurs is: 2 
+0

连接是绝对不需要的:'[s [i:i + 3] for range in(len(s)-2)]。count('bob')' – Muposat

+0

@Muposat你是绝对正确的。我忘了我正在处理一个字符串而不是一个列表。谢谢。 –