无法使我的计数功能在Python中工作

时间:2012-01-06 13:46:46

标签: python function python-3.x

我正在尝试创建一个函数,您可以在单词“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()

6 个答案:

答案 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中是否有更好的方法。但我试图在正则表达式的帮助下做到这一点,但没有找到办法。