2017-04-21 92 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

這的確是愚蠢的,但你是對的它是一條線 –

相關問題