如何使用 Python 逻辑检查回文

2024-12-18 08:39:00
admin
原创
148
摘要:问题描述:我正在尝试使用 Python 检查回文。我拥有的代码非常for循环密集。在我看来,人们从 C 转到 Python 时犯的最大错误就是尝试使用 Python 实现 C 逻辑,这会导致程序运行缓慢,而且无法充分利用该语言。我在这个网站上看到。搜索“C 风格的 for”,Python 没有 C 风格的 f...

问题描述:

我正在尝试使用 Python 检查回文。我拥有的代码非常for循环密集。

在我看来,人们从 C 转到 Python 时犯的最大错误就是尝试使用 Python 实现 C 逻辑,这会导致程序运行缓慢,而且无法充分利用该语言。

我在这个网站上看到。搜索“C 风格的 for”,Python 没有 C 风格的 for 循环。可能已经过时了,但我将其解释为 Python 有自己的方法。

我尝试四处寻找,但找不到太多关于此问题的最新 (Python 3) 建议。如何在不使用 for 循环的情况下解决 Python 中的回文挑战?

我在课堂上用 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 和索引 max,然后将索引 0+1 与 max-1 进行比较,直到出现结果。如何在 Python 中最好地做到这一点?

  2. 我的 for 循环(在范围(999,100,-1)内),在 Python 中这是一种糟糕的执行方法吗?

  3. 有没有人能为我这样的人提供一些好的建议、好的网站或资源?我不是程序员,也不渴望成为一名程序员,我只想学得足够多,这样当我写本科学位论文(电气工程)时,我就不必在努力在项目中获得良好结果的同时学习一门适用的编程语言。“如何从基本的 C 语言发展到出色的 Python 应用”,诸如此类。

  4. 任何特定的代码片段都可以很好地解决这个问题,我也将不胜感激,我需要学习好的算法。我设想了三种情况。如果值是零或个位数,如果它是奇数长度,如果它是偶数长度。我打算写 for 循环...

PS:问题是:找出两个 3 位整数的乘积中的最高值,并且该乘积也是回文。


解决方案 1:

确定给定值是否为回文的 Python 方式:

str(n) == str(n)[::-1]

解释:

  • 我们正在检查的字符串表示形式是否n等于的反向字符串表示形式n

  • 切片[::-1]负责反转字符串

  • 之后,我们使用==

解决方案 2:

另一种不太直观的[::-1]语法是这样的:

>>> test = "abcba"
>>> test == ''.join(reversed(test))
True

reversed函数返回 中的字符的反转序列test

''.join()将这些字符重新连接在一起,中间没有任何中间部分。

解决方案 3:

仅供记录,对于那些寻找更算法的方式来验证给定的字符串是否是回文的人来说,有两种方法可以实现相同的目的(使用whilefor循环):

def is_palindrome(word):

    letters = list(word)    
    is_palindrome = True
    i = 0

    while len(letters) > 0 and is_palindrome:       
        if letters[0] != letters[(len(letters) - 1)]:
            is_palindrome = False
        else:
            letters.pop(0)
            if len(letters) > 0:
                letters.pop((len(letters) - 1))

    return is_palindrome

还有...第二个:

def is_palindrome(word):

    letters = list(word)
    is_palindrome = True

    for letter in letters:
        if letter == letters[-1]:
            letters.pop(-1)
        else:
            is_palindrome = False
            break

    return is_palindrome

解决方案 4:

Python 的奇妙之处在于你可以用它做很多事情。你不必对字符串使用索引。

以下将起作用(使用切片)

def palindrome(n):
    return n == n[::-1]

它所做的只是反转 n,并检查它们是否相等。 n[::-1]反转 n(-1 表示减少)

“2)我的 for 循环(在范围(999,100,-1)内),在 Python 中这是一种糟糕的执行方法吗?”

关于上述内容,您想使用xrange而不是范围(因为范围将创建一个实际列表,而 xrange 是一个快速生成器)

我对问题 3 的看法

我在学习 Python 之前学习了 C,我只是阅读了文档,然后使用控制台对其进行了操作。(并且还通过做欧拉计划问题:)

解决方案 5:

如果是回文,下面的代码将打印0,否则将打印-1

优化代码

word = "nepalapen"
is_palindrome = word.find(word[::-1])
print is_palindrome

输出:
0

word = "nepalapend"
is_palindrome = word.find(word[::-1])
print is_palindrome

输出:
-1

解释:

搜索字符串时,返回的值是字符串开始位置的值。

因此,当您这样做时,word.find(word[::-1])它会nepalapen在位置处找到0[::-1]反转nepalapen,并且它仍然nepalapen在位置处,0因此0返回。

现在,当我们搜索nepalapend然后反转时nepalapend,它会呈现dnepalapen一个FALSE语句,导致搜索无法找到,从而导致一个值,表示未找到字符串。nepalapend`dnepalapennepalapend-1`


另一种方法如果是回文则打印true否则打印false

word = "nepalapen"
print(word[::-1]==word[::1])

输出:
TRUE

解决方案 6:

还有一种实用的方法:

def is_palindrome(word):
  if len(word) == 1: return True
  if word[0] != word[-1]: return False
  return is_palindrome(word[1:-1])

解决方案 7:

我知道这个问题之前已经回答过了,打扰了,我深表歉意。不过,我也在研究用 Python 实现这个的方法,我想分享一下我实现的方法,如下所示,

word = 'aibohphobia'

word_rev = reversed(word)

def is_palindrome(word):
    if list(word) == list(word_rev):
        print'True, it is a palindrome'
    else:
        print'False, this is''t a plindrome'

is_palindrome(word)

解决方案 8:

最具 Python 风格的方法确实是使用切片符号来反转字符串,正如前面提到的:

def is_palindrome(string: str) -> bool:
    return string == string[::-1]

不过,在其他一些场合(比如技术面试),你可能必须编写一个“适当的”算法来找到回文。在这种情况下,下面的方法应该可以解决问题:

def is_palindrome(string: str) -> bool:
    start = 0
    end = len(string) - 1
    
    while end >= start:
        if string[end] != string[start]:
            return False
        start += 1
        end -= 1
        
    return True
  • 设置指向字符串开始和结束的指针

  • 迭代直至end超过start

  • end如果和索引中的字符start不匹配,那么这不是回文,否则继续比较

  • start指针加1

  • 将指针减end1


测试用例:

import unittest

class Test(unittest.TestCase):

    palindromes = ['a', 'aa', 'aba', '12321']
    non_palindromes = ['ab', 'aab', 'cacacc']
    def test_is_palindrome(self):
        for case in self.palindromes:
            self.assertTrue(is_palindrome(case))

        for case in self.non_palindromes:
            self.assertFalse(is_palindrome(case))


if __name__ == '__main__':
    unittest.main()

解决方案 9:

这里有一个不区分大小写的函数,因为上述所有解决方案都是区分大小写的。

def Palindrome(string): 

  return (string.upper() == string.upper()[::-1]) 

该函数将返回一个布尔值。

解决方案 10:

在学习 Watterloo python 课程时,同样的问题被提出作为“课程”,请在此处查找信息:

http://cscircles.cemc.uwaterloo.ca/13-lists/

作为新手,我通过以下方式解决了该问题:

def isPalindrome(S):
    pali = True
    for i in range (0, len(S) // 2):
        if S[i] == S[(i * -1) - 1] and pali is True:
            pali = True
        else:
            pali = False
    print(pali)
    return pali

该函数名为isPalindrome(S),需要一个字符串"S"。返回值默认为TRUE,对第一个 if 语句进行初始检查。

之后,for 循环运行一半长度的字符串,以检查字符串“S”中位于“i”位置的字符是否从前面和后面相同。如果情况并非如此,则函数停止,打印出 FALSE 并返回 false。

干杯。kg

解决方案 11:

如果字符串包含大写字母或非字母字符,则该函数将所有字符转换为小写字母,并使用正则表达式删除所有非字母字符,最后递归应用回文检查:

import re

rules = [
    lambda s: any(x.isupper() for x in s),
    lambda s: not s.isalpha()
]


def is_palindrome(s):
    if any(rule(s) for rule in rules):
        s = re.sub(r'[^w]', '', s).lower()
    if len(s) < 2:
        return True
    if s[0] != s[-1]:
        return False
    return is_palindrome(s[1:-1])


string = 'Are we not drawn onward, we few, drawn onward to new era?'

print(is_palindrome(string))

输出True针对的是上面的输入。

解决方案 12:

我刚刚发现了一种更简单的方法。只有一行。

is_palindrome = word.find(word[::-1])

解决方案 13:

您问的是 Python 中的回文。回文可以用于字符串、数字和列表。不过,我刚刚发布了一个简单的代码来检查字符串的回文。

# Palindrome of string
str=raw_input("Enter the string
")
ln=len(str)
for i in range(ln/2) :
    if(str[ln-i-1]!=str[i]):
        break
if(i==(ln/2)-1):
    print "Palindrome"
else:
    print "Not Palindrome"

解决方案 14:

假设字符串“s”

palin = lambda s: s[:(len(s)/2 + (0 if len(s)%2==0 else 1)):1] == s[:len(s)/2-1:-1]  
# Test
palin('654456')  # True
palin('malma')   # False
palin('ab1ba')   # True

解决方案 15:

#compare 1st half with reversed second half
# i.e. 'abba' -> 'ab' == 'ba'[::-1]

def is_palindrome( s ):
   return True if len( s ) < 2 else s[ :len( s ) // 2 ] == s[ -( len( s ) // 2 ):][::-1]

解决方案 16:

您可以使用 Python 中的 Deques 来检查回文

`def palindrome(a_string):
ch_dequeu = Deque()
for ch in a_string:
ch_dequeu.add_rear(ch)
still_ok = True
while ch_dequeu.size() > 1 and still_ok:
first = ch_dequeu.remove_front()
last = ch_dequeu.remove_rear()
if first != last:
still_ok = False
return still_ok`

`class Deque:
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
def add_rear(self, item):
self.items.insert(0, item)
def add_front(self, item):
self.items.append(item)
def size(self):
return len(self.items)
def remove_front(self):
return self.items.pop()
def remove_rear(self):
return self.items.pop(0)`

解决方案 17:

import string

word = input('Please select a word to test 
')
word = word.lower()
num = len(word)

x = round((len(word)-1)/2)
#defines first half of string
first = word[:x]

#reverse second half of string
def reverse_odd(text):
    lst = []
    count = 1
    for i in range(x+1, len(text)):

        lst.append(text[len(text)-count])
        count += 1
    lst = ''.join(lst)
    return lst

#reverse second half of string
def reverse_even(text):
    lst = []
    count = 1
    for i in range(x, len(text)):
        lst.append(text[len(text)-count])
        count += 1
    lst = ''.join(lst)
    return lst


if reverse_odd(word) == first or reverse_even(word) == first:
    print(string.capwords(word), 'is a palindrome')
else:
    print(string.capwords(word), 'is not a palindrome')

解决方案 18:

“算法”方式:

import math

def isPalindrome(inputString):
    if inputString == None:
        return False

    strLength = len(inputString)
    for i in range(math.floor(strLength)):
        if inputString[i] != inputString[strLength - 1 - i]:
            return False
    return True

解决方案 19:

如果你不想使用反向,还有另一种方法,即使用函数

#!/usr/bin/python

A = 'kayak'

def palin(A):

    i = 0
    while (i<=(A.__len__()-1)):
        if (A[A.__len__()-i-1] == A[i]):
            i +=1
        else:
         return False

if palin(A) == False:

    print("Not a Palindrome")

else :

    print ("Palindrome")

解决方案 20:

使用递归后看起来更漂亮!

def isPalindrome(x):
z = numToList(x)
length = math.floor(len(z) / 2)
if length < 2:
    if z[0] == z[-1]:
        return True
    else:
        return False
else:
    if z[0] == z[-1]:
        del z[0]
        del z[-1]
        return isPalindrome(z)
    else:
        return False

解决方案 21:

def is_palindrome(string):
   return string == ''.join([letter for letter in reversed(string)])

解决方案 22:

print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]

这是编写单行代码的典型方式

解决方案 23:

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

解决方案 24:

我尝试使用这个:

def palindrome_numer(num):
num_str = str(num)
str_list = list(num_str)
if str_list[0] == str_list[-1]:
    return True
return False

它适用于数字,但我不知道字符串是否

解决方案 25:

def isPalin(checkWord):
    Hsize = len(lst)/2
    seed = 1
    palind=True
    while seed<Hsize+1:
        #print seed,lst[seed-1], lst [-(seed)]
        if(lst[seed-1] != lst [-seed]):
            palind = False
            break
        seed = seed+1
    return palind

lst = 'testset'
print lst, isPalin(lst)    
lst = 'testsest'
print lst, isPalin(lst) 

输出

testset True
testsest False

解决方案 26:

您可以使用这个返回布尔值的单行代码:

str(x)==str(x)[::-1]

由于类型转换,这对文字和数字都有效......

解决方案 27:

此方法可以解决该问题:

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

最好的!

解决方案 28:

def palindrome_or_not(val):
    length = len(val)
    for i in range(length // 2):
        if val[i] != val[length - 1 - i]:
            return 'Not Palindrome'
    return 'Palindrome'

print(palindrome_or_not('malayalam'))

解决方案 29:

#!/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"

解决方案 30:

也许你可以尝试这个:

list=input('enter a string:')

if (list==list[::-1]):
    print ("It is a palindrome")
else:
   print("it is not palindrome")
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用