如何使用Python逻辑检查回文

DrO*_*ine 43 python string palindrome

我正在尝试使用Python检查回文.我的代码非常for密集.

在我看来,从C到Python的最大错误是尝试使用Python实现C逻辑,这使得事情运行缓慢,并且它只是没有充分利用语言.

我在这个网站上看到了.搜索"C-style for",Python没有C风格的循环.可能会过时,但我将其解释为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
Run Code Online (Sandbox Code Playgroud)

我在这里遗漏了很多代码.五个哈希只是我自己的提醒.

具体问题:

  1. 在C中,我会创建一个for循环,将索引0与索引max进行比较,然后使用max-1索引0 + 1,直到某事为止.如何在Python中做到最好?

  2. 我的for循环(在范围(999,100,-1)中,这是用Python做错的方法吗?

  3. 有没有人对我的职位有任何好的建议,好的网站或资源?我不是程序员,我不想成为一名程序员,我只想学习足够的东西,这样当我写完学士学位论文(电子工程)时,我不必同时学习适用的编程语言在项目中取得好成绩."如何从基本的C转到Python的伟大应用",那种事情.

  4. 任何特定的代码都可以很好地解决这个问题,我需要学习好的算法.我正在设想3种情况.如果值为零或单个数字,如果它是奇数长度,如果它是偶数长度.我打算为循环写...

PS:问题是:找到两个3位整数的最高值乘积,它也是一个回文.

Ósc*_*pez 171

确定给定值是否为回文的pythonic方法:

str(n) == str(n)[::-1]
Run Code Online (Sandbox Code Playgroud)

说明:

  • 我们正在检查字符串表示是否n等于反向字符串表示n
  • [::-1]片采用反相字符串的护理
  • 之后,我们比较使用的平等 ==

  • `[:: - 1]`是高级切片.`[a:b:c]`表示从步长为"c"的"a"(包括)到"b"(不包括)的切片. (12认同)
  • 它没有.它只是检查单词是否与其自身相反.python的一个优点是它允许您在更高的抽象级别工作,从而产生更清晰,更优雅的解决方案 (5认同)
  • @DrOnline `::` 部分称为 _slice_,在 [here](http://stackoverflow.com/a/509295/201359) 中阅读所有相关信息 (3认同)

Ric*_*dle 25

这种相当不直观的[::-1]语法的替代方法是:

>>> test = "abcba"
>>> test == ''.join(reversed(test))
True
Run Code Online (Sandbox Code Playgroud)

reversed函数返回相反的字符序列test.

''.join() 将这些角色再次连接起来,两者之间没有任何内容

  • @RichieHindle:我发现`''.join(reverse(test))`和`[:: - 1]`一样不直观._really_直觉行为是你可以编写`test == reverse(test)`.(我不是downvoter.) (3认同)
  • 你可以做`list(test)== list(reverse(test))`. (3认同)

Jor*_*dez 10

只是为了记录,以及那些寻找更多算法来验证给定字符串是否为回文的人,有两种方法可以实现相同的(使用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
Run Code Online (Sandbox Code Playgroud)

而......第二个:

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
Run Code Online (Sandbox Code Playgroud)


jh3*_*314 7

python的优秀部分是你可以用它做的事情.您不必为字符串使用索引.

以下将工作(使用切片)

def palindrome(n):
    return n == n[::-1]
Run Code Online (Sandbox Code Playgroud)

它的作用是简单地反转n,并检查它们是否相等. n[::-1]反转n(-1意味着递减)

"2)我的for循环(在范围(999,100,-1)中,这是用Python做错的方法吗?"

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

我对问题3的看法

我在Python之前学过C,我只是阅读文档,并使用控制台玩它.(以及通过做项目欧拉问题:)


Gan*_*dey 6

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

优化代码

word = "nepalapen"
is_palindrome = word.find(word[::-1])
print is_palindrome
Run Code Online (Sandbox Code Playgroud)

输出: 0

word = "nepalapend"
is_palindrome = word.find(word[::-1])
print is_palindrome
Run Code Online (Sandbox Code Playgroud)

输出: -1

说明:

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

因此,当您执行word.find(word[::-1])此操作时,它会nepalapen在某个位置找到0[::-1]反转nepalapen,并且仍然nepalapen在该位置,0因此0将其返回。

现在,当我们搜索nepalapend,然后扭转nepalapenddnepalapen它呈现一个FALSE声明nepalapend被逆转dnepalapen导致搜索无法找到nepalapend导致价值的-1指示字符串没有找到。


如果回文则打印,否则打印

word = "nepalapen"
print(word[::-1]==word[::1])
Run Code Online (Sandbox Code Playgroud)

输出: TRUE