如何使用Python逻辑检查回文字符串

57

我想使用Python检查回文。 我目前的代码使用循环次数很多的 for 循环。

在我看来,从C语言转到Python时人们犯的最大错误是试图使用C逻辑来实现Python代码,这会使得代码运行缓慢,并且无法充分利用Python语言的特点。

这个网站上,搜索"C-style for",可以看到Python没有C风格的for循环。 虽然可能已经过时,但我理解为Python有自己的方法。

我尝试了一些查询,但并没有找到最新(Python 3)的关于如何不使用for循环解决回文问题的建议。

在课堂上我已经用C语言完成了这个问题,但我想个人挑战一下用Python解决它。 这个问题来自欧拉计划,顺便说一下,这是一个很棒的网站。

def isPalindrome(n):
    lst = [int(n) for n in str(n)]
    l=len(lst)
    if l==0 || l==1:
        return True
    elif len(lst)%2==0:
        for k in range (l)
        #####
    else:
        while (k<=((l-1)/2)):
            if (list[]):
                #####   

for i in range (999, 100, -1):
    for j in range (999,100, -1):
        if isPalindrome(i*j):
            print(i*j)
            break

这里缺少很多代码。这五个#号只是提醒自己的。

具体问题:

  1. 在C语言中,我会制作一个for循环,将索引0与索引最大值进行比较,然后将索引0 + 1与max-1进行比较,直到某些条件满足。在Python中如何更好地做到这一点?

  2. 我的for循环(在in range(999、100、-1)中),在Python中是否有更好的方法?

  3. 是否有任何好的建议、有用的网站或资源适用于我这种情况的人? 我不是程序员,也没有成为程序员的愿望,我只想学习足够的知识,以便在撰写本科论文(电气工程)时,不必同时学习适用的编程语言并尝试获得良好的项目结果。 “从基本的C到优秀的Python应用程序”,这样的东西。

  4. 任何使此问题具有极佳解决方案的特定代码也将不胜感激,我需要学习良好的算法... 我正在设想3种情况:如果该值为零或一位数,如果长度为奇数,如果长度为偶数。我打算写for循环...

附:问题是:找到两个三位数的最大乘积,其也是回文数。


1
相关链接:http://stackoverflow.com/a/7460573/846892 - Ashwini Chaudhary
2
我相信这是ProjectEuler #4。你应该能够找到一些解决方案,可以介绍给你Python。但从外观上看,你的实现并不糟糕。你的isPalindrome可以更简单。你可能还想将所有找到的回文存储在一个列表中,然后对其进行排序以找到最高值。如果你只是break,你不能保证得到最高值的回文。 - wflynny
1
所有这些答案都不错,但请记住,正如所述,您的单词/短语必须是一个完全回文才能起作用,包括大小写、空格和标点符号。如果您想匹配像“Do geese see God?”这样的情况,您需要查看像.lower().translate()这样的方法来使情况统一并除去空格和标点符号。 - Crowman
@PaulGriffiths 谢谢你,我在这个特定的程序中处理数字,但我已经看到了 .lower() 和 .upper() 函数,.translate() 我会研究一下。非常感谢! - DrOnline
仅为澄清对这个问题的未来访问者。C语言检查回文的方式将涉及到像下面这样的for循环:for(int i=0; i<len(str)/2; i++) if str[i] != str[len(str)-i-1]: return False - Ghos3t
36个回答

0

我写了这段代码:

word = input("enter: ")
word = ''.join(word.split())`
for x in range(len(word)):
if list(word)[x] == ((list(word)[len(word)-x-1])):
if x+1 == len(word):
print("its pali")

它可以工作。 它获取单词,然后去掉空格并将其转换为列表 然后它测试第一个字母是否等于最后一个字母,第二个字母是否等于倒数第二个字母,以此类推。

然后 'if x+1 == len(word)' 意味着由于x从0开始,它变成1,然后对于每个下一个..等等,它都可以工作,所以它可以工作。


你需要正确的缩进,否则代码将无法编译! - Jacob G.

0
def pali(str1):
    l=list(str1)
    l1=l[::-1]
    if l1==l:
        print("yess")
    else:
        print("noo")
str1="abc"
a=pali(str1)
print(a)

0
这种方法可以解决这个问题。
def is_palindrome(word:str) -> bool:
    word_lst = list(word)
    if not word_lst and (len(word_lst)<=1) and (len(word_lst)>=10**5):
        return
    reversed_word_lst = word_lst[::-1]
    return word_lst == reversed_word_lst

最好的!

-1
#!/usr/bin/python

str = raw_input("Enter a string ")
print "String entered above is %s" %str
strlist = [x for x in str ]
print "Strlist is %s" %strlist
strrev = list(reversed(strlist)) 
print "Strrev is %s" %strrev
if strlist == strrev :
   print "String is palindrome"
else :
   print "String is not palindrome"

-1

这非常简单

#palindrome
a=raw_input("enter the word")
b=a[::-1]
if a==b:
 print("enter word is palindrome")
else:`enter code here`
 print("not a palindrome")

谢谢


这个解决方案已经被提供了,你在阅读现有答案之前就跳进来了。 - msudder

-1

这里有一个示例,它接受用户的输入并检查该输入是否为回文:

name = input("Write your word here:  ")
input("Press <enter> to check if the word is a palindrome.")
if str(name) == str(name)[::-1]:
    print("True")
else:
    print("False")

然而,你甚至不需要设置 if/else 语句。你可以直接打印逻辑比较的结果,就像这样:

name = input("Write your word here:  ")
input("Press <enter> to check if the word is a palindrome.")
print(str(name) == str(name)[::-1])

2
请解释一下你的帖子。它对提问者有什么帮助?应该如何实施?对你来说很明显的事情可能对别人来说并不明显。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接