我正在尝试创建一个函数,您可以在单词“banana”中添加诸如“ana”之类的短语,并计算它在单词中找到短语的次数。我找不到我为某些测试单元无法正常工作的错误。
def test(actual, expected):
""" Compare the actual to the expected value,
and print a suitable message.
"""
import sys
linenum = sys._getframe(1).f_lineno # get the caller's line number.
if (expected == actual):
msg = "Test on line {0} passed.".format(linenum)
else:
msg = ("Test on line {0} failed. Expected '{1}', but got '{2}'.".format(linenum, expected, actual))
print(msg)
def count(phrase, word):
count1 = 0
num_phrase = len(phrase)
num_letters = len(word)
for i in range(num_letters):
for x in word[i:i+num_phrase]:
if phrase in word:
count1 += 1
else:
continue
return count1
def test_suite():
test(count('is', 'Mississippi'), 2)
test(count('an', 'banana'), 2)
test(count('ana', 'banana'), 2)
test(count('nana', 'banana'), 1)
test(count('nanan', 'banana'), 0)
test(count('aaa', 'aaaaaa'), 4)
test_suite()
答案 0 :(得分:5)
将count
函数更改为以下函数会通过测试:
def count(phrase, word):
count1 = 0
num_phrase = len(phrase)
num_letters = len(word)
for i in range(num_letters):
if word[i:i+num_phrase] == phrase:
count1 += 1
return count1
答案 1 :(得分:4)
使用str.count(substring)
。这将返回子字符串在完整字符串(str
)中出现的次数。
以下是一个展示其工作原理的互动会话:
>>> 'Mississippi'.count('is')
2
>>> 'banana'.count('an')
2
>>> 'banana'.count('ana')
1
>>> 'banana'.count('nana')
1
>>> 'banana'.count('nanan')
0
>>> 'aaaaaa'.count('aaa')
2
>>>
如您所见,该功能不重叠。如果您需要重叠行为,请查看此处:string count with overlapping occurrences
答案 2 :(得分:0)
您使用的迭代错误,所以:
for i in range(num_letters): #This will go from 1, 2, ---> len(word)
for x in word[i:i+num_phrase]:
#This will give you the letters starting from word[i] to [i_num_phrase]
#but one by one, so : for i in 'dada': will give you 'd' 'a' 'd' 'a'
if phrase in word: #This condition doesnt make sense in your problem,
#if it's true it will hold true trough all the
#iteration and count will be
#len(word) * num_phrase,
#and if it's false it will return 0
count1 += 1
else:
continue
答案 3 :(得分:0)
我猜,str.count(substring)是错误的解决方案,因为它不计算重叠的子串并且测试套件失败。
还有内置str.find方法,可能有助于完成任务。
答案 4 :(得分:0)
另一种方式:
def计数(序列,项目):
sort -k1,1 -k4,4n -k5,5n -rk9,9 |\
awk '{ seen[$1,$4,$5]++ }
$9 ~ /^Name=/ {print; next}
seen[$1,$4,$5] > 1 { next; }
{ print }'
答案 5 :(得分:-1)
这个时候有一个基本的问题。
当你看到像"isisisisisi"
howmany这样的字符串时,“isi”你算了吗?
在第一个状态下,您会看到字符串"isi s isi s isi"
并返回3作为计数。
在第二个状态下,您会看到字符串"isisisisisi"
并按照此"isi isi isi isi isi"
计算每个短语的“i”两次。
换句话说,第二个'i'是第一个'isi'的第一个字符,第二个'isi'的第一个字符。
所以你必须将5作为计数。
对于第一个州只需使用:
>>> string = "isisisisisi"
>>> string.count("isi")
3
对于第二个州,您必须识别搜索关键字中的"phrase"+"anything"+"phrase"
。
以下功能可以做到:
def find_iterate(Str):
i = 1
cnt = 0
while Str[i-1] == Str[-i] and i < len(Str)/2:
i += 1
cnt += 1
return Str[0:cnt+1]
现在,您可以选择在字符串中计算搜索关键字。
例如我在下面这样做:
if __name__ == "__main__":
search_keyword = "isi"
String = "isisisisisi"
itterated_part = find_iterate(search_keyword)
c = 0
while search_keyword in String:
c += String.count(search_keyword)
String = String.replace(search_keyword, itterated_part)
print c
我不知道在python中是否有更好的方法。但我试图在正则表达式的帮助下做到这一点,但没有找到办法。