2017-06-15 83 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你是絕對正確的。我忘了我正在處理一個字符串而不是一個列表。謝謝。 –