0

我一直在研究这个回文程序,并且非常接近完成它。接近到它让我有点发疯的地步哈哈。该程序应该检查每个“短语”以确定它是否是回文,并返回一个小写版本,如果它实际上是回文,则删除空格和标点符号。否则,如果不是,它应该返回 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() 
4

4 回答 4

1

也许这条线导致了问题。

for word in data:
    word == word.split() # This line.
    Palindromize(word)

您在这里测试相等性,而不是重新分配word可以使用word = word.split(). word然后成为一个列表,您可能希望使用

for elem in word:
    Palindromize(elem)

另外,您似乎正在调用spliton 方法int,这是不可能的,请尝试将它们转换为字符串。

另外,为什么要在for循环中将短语转换为小写,只需执行一次就足够了。

于 2013-06-11T08:50:00.607 回答
1

在你的程序的“核心”,你可以在 Python 中做得更好,filter例如使用。这是一个快速演示:

>>> 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
于 2013-06-11T09:05:54.300 回答
1

在你去香蕉之前,让我们重新考虑一下这个问题:

  1. 您已经指出回文仅在没有标点符号、空格或大小写混合的字符串中才有意义。因此,您需要通过删除不需要的字符或选择允许的字符来转换输入字符串。对于后者,可以想象:

导入字符串

clean_data = [ch for ch in original_data if ch in string.ascii_letters]

clean_data = ''.join(clean_data).lower()

  1. 有了输入的清理版本,人们可能会考虑在字符串切片中的第三个参数,特别是当它是 -1 时;)

比较喜欢

if clean_data[::-1] == clean_data:
    ....

按门铃?

于 2013-06-11T10:12:04.407 回答
0

我发现的主要错误之一是:

for word in data:
    word==word.split()

这里有两个错误: 1. 双等号在这里没有意义。2. 如果您希望拆分数据每次迭代的内容,那么这样做不会更改原始列表,因为您正在修改名为word. 要实现您的列表,请执行以下操作:

for i in range(data):   
      data[i]=data[i].split()

这可能会清除您的错误

于 2013-06-11T08:50:37.097 回答