【问题标题】:Count number of occurences of certain character in two strings with Python用 Python 计算两个字符串中某个字符的出现次数
【发布时间】:2021-05-07 12:18:37
【问题描述】:

我想使用 Python 中的递归计算 a 和 b 在两个字符串中同时出现的次数。

例如,如果输入是 ('aabb', 'bbba'),则输出将是 (3,5),因为总共有 3 个 a 和 5 个 b。

我尝试过的:

def counting(string1, string2):    
   if not string1:
      return 0
   elif string1[0]=='a':
      return 1+counting(string[1:],string2)
   else:
      return counting(string[1:],string2)

【问题讨论】:

  • @toptalent 那么请务必在下方留下答案!
  • 一定要用递归还是可以用其他方法?
  • 对于输入而不是counting(string1, string2) 如果我是你,我会使用counting(*strings) 作为那种类型的函数。
  • 您的尝试有什么问题?即你的问题是什么?
  • 问题要求两个参数是两个字符串,没有别的。而且只能是单一功能

标签: python


【解决方案1】:

您的错误是引用了无效变量。你试图在这一行访问变量string

return counting(string[1:],string2)

...应该是string1。你可以像这样修复它:

return counting(string1[1:],string2)

【讨论】:

    【解决方案2】:

    通过recursion

    NOTE:如果你之前合并两个字符串,那么你可以进一步简化这个算法

    def counting(s, v):
        if not s:
            return 0
        elif s[0] == v:
            return 1+counting(s[1:], v)
        else:
            return counting(s[1:], v)
    
    
    def count(s1, s2):
        return (counting(s1, 'a') + counting(s1, 'b')), (counting(s2, 'a') + counting(s2, 'b'))
    
    count('aaab','bba') # will print (4,3)
    

    通过Counter:

    你可以合并两个字符串,然后计算值:

    from collections import Counter
    print(Counter(''.join(('aabb', 'bbba'))).values()) #[3,5]
    

    更新功能:

    def counting(string1, string2):
        return Counter(string1+string2).values()
        
    counting('aab','bbb')
    

    【讨论】:

    • 问题要求两个参数是两个字符串,没有别的。而且只有一个功能
    【解决方案3】:

    更新

    考虑到您在 cmets 中的规格,我想出了这个:

    def counting(string1: str, string2: str) -> tuple[int, int]:
        if not string1 and not string2:
            return 0, 0
    
        if not string1:
            str1a = str1b = 0
        elif string1[0] == "a":
            str1a, str1b = 1, 0
        else:
            str1a, str1b = 0, 1
    
        if not string2:
            str2a = str2b = 0
        elif string2[0] == "a":
            str2a, str2b = 1, 0
        else:
            str2a, str2b = 0, 1
    
        next_round = counting(string1[1:], string2[1:])
    
        return next_round[0] + str1a + str2a, next_round[1] + str1b + str2b
    
    
    print(counting("aabb", "bbba"))
    
    >> (3, 5)
    

    旧答案:

    您的递归函数运行良好,但是使用递归来跟踪两个变量,每个变量有两个字母可能会变得非常困难。我建议您使用递归函数一次计算一个单词中一个字母的出现次数,然后将结果相加。

    为了使其在未来更具可扩展性(更多/其他单词,更多/其他要计算的字母),您可以创建这样的函数:

    # You only count the occurrence of one letter in one word.
    def counting(string: str, letter: str) -> int:
        if not string:
            return 0
        elif string[0] == letter:
            return 1 + counting(string[1:], letter)
        else:
            return counting(string[1:], letter)
    
    
    # here you add up the results
    def get_all_occurrences(word_list: list[str], letter_list: list[str]) -> tuple[int]:
        letters_profile = []
        for letter in letter_list:
            letter_occurrences = 0
            for word in word_list:
                letter_occurrences += counting(word, letter)
            letters_profile.append(letter_occurrences)
    
        return tuple(letters_profile)
    
    
    words = ["aabb", "abbb"]
    letters = ["a", "b"]
    
    occurrences = get_all_occurrences(words, letters)
    print(occurrences)
    

    【讨论】:

    • 问题要求两个参数是两个字符串,没有别的。而且只有一个功能
    猜你喜欢
    • 2017-10-09
    • 2010-11-12
    • 2013-12-25
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多