2017-04-21 53 views
0

我需要帮助来获得这个python函数。 一个递归函数count_upper_lower(),它接受一个非空字符串作为其参数,并返回一个元组,其中包含字符串中有多少个字母大写以及多少个小写(按该顺序)的计数。 例如使用递归计算Python中的大写和小写字母

print (count_upper_lower(’Town Hall University’)) 

将返回

(3, 15) 

这是我迄今为止

def count_upper_lower(word): 
    upper = 0 
    lower = 0 
    if word == "": 
     upper = 0 
     lower = 0 
     return upper, lower 
    elif word[0].isupper(): 
     upper = 1 + count_upper_lower(word[1:]) 
     return upper , lower 


    elif word[0].islower(): 
     lower = 1 + count_upper_lower(word[1:]) 
     return upper , lower 

    else: 
     upper = 0 + count_upper_lower(word[1:]) 
     lower = 0 + count_upper_lower(word[1:]) 
     return upper, lower 

我收到以下错误:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple' 
+1

提示:通过“word ==”a“'调用。你期望'1 +(0,0)'是什么? – timgeb

回答

1

正如指出的那样,你想整型添加到元组,这就是为什么你所得到的错误消息。请考虑以下示例:

def count_upper_lower(word): 
    if not word: 
     return 0, 0 
    else: 
     upper, lower = count_upper_lower(word[1:]) 
     if word[0].isupper(): 
      return upper+1, lower 
     elif word[0].islower(): 
      return upper, lower+1 
     else: 
      # make sure that this is what you want 
      return upper, lower 

此处,函数递归调用自身,直到字符串用完。其他情况捕捉到字符既不是高位字符也不是低位字符(例如数字)的情况,在这种情况下,不会增加计数器。

+0

这正是我所需要的。我的元组添加不正确。非常感谢 :-) –

1

我会用一个 循环和ascii。在ASCII表格65中,直到91是大写字母,并且97直到123是小写字母。

def count_upper_lower(word): 
    upper = 0 
    lower = 0 
    for letter in word: #runs through all the letter if empty nothing happens 
     if 65 <= ord(letter) <= 90: 
      upper += 1 
     elif 97 <= ord(letter) <= 122: 
      lower += 1 
    return upper,lower 

这也是可能的。

def count_upper_lower(word): 
    upper = 0 
    lower = 0 
    for letter in word: #runs through all the letter if empty nothing happens 
     if letter.isupper(): 
      upper += 1 
     elif letter.islower(): 
      lower += 1 
    return upper,lower 
+0

即将发布类似的解决方案,这是正确的方法imo – chukkwagon

+2

这不是递归的,我认为OP使用'isupper'和'islower'方法的建议比使用ASCII字符标识符更具pythonic。 –

+0

谢谢,但它必须递归 –

0

在你else块,你试图返回的元组从count_upper_lower()添加到号。

class myCounter(): 
    def __init__(self): 
     self.lower = 0 
     self.upper = 0 

    def count(self, s): 
     if not s: 
      return (self.upper, self.lower) 

     firstCharacter = s[0] 

     if firstCharacter.islower(): 
      self.lower += 1 
     elif firstCharacter.isupper(): 
      self.upper += 1 
     else: 
      pass #do nothing ! 

     return self.count(s[1:]) 


c = myCounter() 
print(c.count("Town Hall University")) 
>>> (3, 15) 
0

使用tuple时出现问题,因为它是不可变的数据结构。改为使用list

def count_letters(phrase): 
    if phrase: 
     letter = phrase[0] 
     result = count_letters(phrase[1:]) 
     if letter.isupper(): 
      result[0] += 1 
     elif letter.islower(): 
      result[1] += 1 
     return result 
    else: 
     return [0, 0] 


>>> count_letters("LaLaa") 
[2, 3] 
+0

谢谢它,虽然它返回一个清单 –

1

如果你想用两行代码做到这一点:

lst = [1 if letter.islower() else 0 for letter in word if letter.islower() or letter.isupper()] 
print (lst.count(0),lst.count(1)) 
+0

我也挑战所有人,使它在一行 –

+0

只需要在打印语句中用列表理解替换lst:D愚蠢,但1行 – VeGABAU

+0

这的确是愚蠢的,但你是对的它是一条线 –

相关问题