我一直在研究这个Palindrome计划,我非常接近完成它。接近这一点,这让我有点疯狂哈哈。 该程序应该检查每个“短语”以确定它是否是回文并返回小写版本,如果它实际上是回文,则删除空格和标点符号。否则,如果没有,它应该返回None。 我只是将测试数据带入函数时遇到问题。我似乎无法想到处理它的正确方法。它可能很简单......任何想法? 谢谢!
import string
def reverse(word):
newword = ''
letterflag = -1
for numoletter in word:
newword += word[letterflag]
letterflag -= 1
return newword
def Palindromize(phrase):
for punct in string.punctuation:
phrase= phrase.replace(punct,'')
phrase = str(phrase.lower())
firstindex = 0
secondindex = len(phrase) - 1
flag = 0
while firstindex != secondindex and firstindex < secondindex:
char1 = phrase[firstindex]
char2 = phrase[secondindex]
if char1 == char2:
flag += 1
else:
break
firstindex += 1
secondindex -= 1
if flag == len(phrase) // (2):
print phrase.strip()
else:
print None
def Main():
data = ['Murder for a jar of red rum',12321, 'nope', 'abcbA', 3443, 'what',
'Never odd or even', 'Rats live on no evil star']
for word in data:
word == word.split()
Palindromize(word)
if __name__ == '__main__':
Main()
答案 0 :(得分:1)
也许这条线造成了问题。
for word in data:
word == word.split() # This line.
Palindromize(word)
您正在测试此处的相等性,而不是重新分配可以使用word
完成的变量word = word.split()
。 word
然后成为一个列表,您可能希望使用
for elem in word:
Palindromize(elem)
此外,您似乎在split
上调用int
方法,这是不可能的,请尝试将它们转换为字符串。
另外,为什么在for循环中将短语转换为小写,只需执行一次即可。
答案 1 :(得分:1)
在程序的“核心”,你可以使用filter
在Python中做得更好。这是一个快速演示:
>>> phrase = 'Murder for a jar of red rum!'
>>> normalized = filter(str.isalnum, phrase.lower())
>>> normalized
'murderforajarofredrum'
>>> reversed = normalized[-1::-1]
>>> reversed
'murderforajarofredrum'
# Test is it is a palindrome
>>> reversed == normalized
True
答案 2 :(得分:1)
在你去香蕉之前,我们重新考虑一下这个问题:
导入字符串
clean_data = [如果ch在string.ascii_letters中,则ch为original_data中的ch]
clean_data =''。join(clean_data).lower()
比较
if clean_data[::-1] == clean_data:
....
打铃?
答案 3 :(得分:0)
我发现的一个主要错误是:
for word in data:
word==word.split()
这里有两个错误:
双等于此毫无意义。
2.如果您希望拆分每次迭代数据的内容,那么这样做不会更改原始列表,因为您正在修改名为word
的重复集。要获得列表,请执行以下操作:
for i in range(data):
data[i]=data[i].split()
这可能会清除您的错误