Palindrome计划的小问题

时间:2013-06-11 08:42:00

标签: python palindrome

我一直在研究这个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() 

4 个答案:

答案 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)

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

  1. 你已经指出,Palindromes只在没有标点符号,空格或混合大小写的字符串中有意义。因此,您需要转换输入字符串,方法是删除不需要的字符或选择允许的字符。对于后者,人们可以想象:
  2.   

    导入字符串

         

    clean_data = [如果ch在string.ascii_letters中,则ch为original_data中的ch]

         

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

    1. 使用已清理的输入版本,可以考虑切割字符串时的第三个参数,特别是当它为-1时;)
    2. 比较

      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()

这可能会清除您的错误