創建一個程式 palindrome.py,該程式具有一個函式,該函式接受一個字串引數并列印一個句子,指示該文本是否為回文。該函式應僅考慮字串中的字母數字字符,而不依賴于大小寫、標點符號或空格。如果字串是回文,它應該列印:It's a palindrome!但是,如果字串不是回文,它應該列印:It's not a palindrome!
問題
當字串中有空格時,我的代碼不會列印它是否是回文,但會列印出它不是回文,盡管有空格。我在我的代碼中包含了 replace()、zip() 和 reversed() 來解釋空格和反轉的單詞,但它沒有列印出想要的結果。
我在代碼中遺漏了什么或做錯了什么?
import sys
def palindrome(words):
if ' ' in words:
palindromes = words[::-1]
if palindromes == words:
return "It's a palindrome!"
return "It's not a palindrome!"
print(palindrome(sys.argv[1]))
示例測驗用例
測驗用例 1
tests 1 Run python3 palindrome.py 'Dennis, Nell, Edna, Leon, Nedra, Anita, Rolf, Nora, Alice, Carol, Leo, Jane, Reed, Dena, Dale, Basil, Rae, Penny, Lana, Dave, Denny, Lena, Ida, Bernadette, Ben, Ray, Lila, Nina, Jo, Ira, Mara, Sara, Mario, Jan, Ina, Lily, Arne, Bette, Dan, Reba, Diane, Lynn, Ed, Eva, Dana, Lynne, Pearl, Isabel, Ada, Ned, Dee, Rena, Joel, Lora, Cecil, Aaron, Flora, Tina, Arden, Noel, and Ellen sinned' and match its output to an expected value.
測驗用例 2
test 2 Run python3 palindrome.py 'Ed, I saw Harpo Marx ram Oprah W. aside' and match its output to an expected value.
輸出
預期輸出:“這是回文!”
實際輸出:“這不是回文!”
uj5u.com熱心網友回復:
您的整個代碼在第一個if條件下縮進,這意味著它只有在您的輸入字串中有空格時才有效。
最重要的是,添加引數時使用引號還是雙引號?因為 usingsys.argv[1]采用第一個引數。
python3 palindrome.py hey yeh # does not work
python3 palindrome.py "hey yeh" # is supposed to work
您的代碼示例的問題是,在每個非字母字符中,您只是試圖處理空間。
def palindrome(words):
words = ''.join(filter(str.isalnum, words.lower()))
palindrome = words[::-1]
if palindrome == words:
return ("It's a palindrome!")
return ("It's not a palindrome!")
print(palindrome(sys.argv[1]))
uj5u.com熱心網友回復:
我不確定您的代碼試圖實作什么。但是我可以看到您嘗試檢查單詞的長度是否為 1,因為那將自動成為回文。該代碼應該在回圈之外。它可能在您的功能開始時。你應該在 for 回圈中做的是比較單詞和回文中的字符。但是,如果單詞包含標點符號,即使這樣也將失敗,因為在這個問題中沒有考慮這些。我建議您洗掉所有空格和標點符號,并確保所有字符都是小寫或全部大寫(這樣您的函式可以是大寫盲)。然后你可以比較單詞和回文中的字符,一旦找到不相等的字符就回傳 False,如果沒有找到不相等的字符,則回傳 True。
然而,我發現這個程序很長,所以下面是我提出的一個更簡單的解決方案(它完全解決了問題):
def palindrome(words):
new_word = ""
'''
Collect alpha numeric characters into new_word
Spaces are removed and all characters are changed to lower case
so that capitalisation can be ignored
'''
for char in words.replace(" ", "").lower():
if char.isalnum():
new_word = char
# Check if word is a palindrome
if list(new_word) == list(reversed(new_word)):
print("It's a palindrome!")
else:
print("It's not a palindrome")
測驗:
palindrome('Dennis, Nell, Edna, Leon, Nedra, Anita, Rolf, Nora, Alice, Carol, Leo, Jane, Reed, Dena, Dale, Basil, Rae, Penny, Lana, Dave, Denny, Lena, Ida, Bernadette, Ben, Ray, Lila, Nina, Jo, Ira, Mara, Sara, Mario, Jan, Ina, Lily, Arne, Bette, Dan, Reba, Diane, Lynn, Ed, Eva, Dana, Lynne, Pearl, Isabel, Ada, Ned, Dee, Rena, Joel, Lora, Cecil, Aaron, Flora, Tina, Arden, Noel, and Ellen sinned')
Output: It's a palindrome!
uj5u.com熱心網友回復:
請記住,替換替換給定模式的所有出現。沒有真正需要檢查單詞中是否有空格 - 只需無條件地進行即可。
更好的是,使用正則運算式來消除空格和標點符號。
import re
def palindrome(s):
s = re.sub('[^\w]', '', s.lower())
return "It's a palindrome" if s == s[::-1] else "It's not a palindrome"
如果您不想匯入re然后:
def palindrome(s):
s = ''.join(c for c in s.lower() if c.isalnum())
return "It's {}a palindrome".format('' if s == s[::-1] else 'not ')
...如果你喜歡單線:
def palindrome(s):
return "It's {}a palindrome".format('' if (s := ''.join(c for c in s.lower() if c.isalnum())) == s[::-1] else 'not ')
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/446200.html
