首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略空格和标点符号的is_palindrome函数

忽略空格和标点符号的is_palindrome函数
EN

Code Review用户
提问于 2013-09-28 02:57:46
回答 4查看 5.7K关注 0票数 5
代码语言:javascript
复制
from string import punctuation, ascii_lowercase

def is_palindrome(string):
    """Return True if string is a palindrome,
    ignoring whitespaces and punctuation.
    """
    new = ""
    for char in string:
        lc = char.lower()
        for x in lc:
            if x in ascii_lowercase:
                new += x

    return new[::-1] == new

# string = "Was it a rat I saw?"
# print(is_palindrome(string))
EN

回答 4

Code Review用户

回答已采纳

发布于 2013-09-28 03:30:16

  • 您不必要地导入了punctuation
  • 避免在代码中重新分配模块名称(如string )
  • 理解列表将是过滤掉不想要的数据的一种更简单的方法
代码语言:javascript
复制
from string import ascii_letters

def is_palindrome(candidate):
    """
    Returns True if candidate is a palindrome, ignoring whitespaces and punctuation.
    """
    stripped = [char.lower() for char in candidate if char in ascii_letters]
    return stripped == stripped[::-1]
票数 11
EN

Code Review用户

发布于 2013-09-28 10:27:19

这个问题大部分得到了回答,但我认为排除数字并不完全正确,更理想的做法是把整个字符串小写,而不是逐字逐句小写。还有应该检查空字符串。所以我的版本是这样的:

代码语言:javascript
复制
from string import digits, ascii_lowercase

chars = digits + ascii_lowercase

def is_palindrome(s):
    norm = [c for c in s.lower() if c in chars]
    return norm[::-1] == norm != []

但是,在2013年,您可能希望得到这个函数的Unicode版本,它可以如下所示:

代码语言:javascript
复制
from unicodedata import category

def is_palindrome(u):
    norm = [c for c in u.lower() if category(c)[0] in "LN"]
    return norm[::-1] == norm != []

is_palindrome的Unicode版本的一些示例:

代码语言:javascript
复制
>>> is_palindrome(u"...")
False
>>> is_palindrome(u"Was it a rat I saw?")
True
>>> is_palindrome(u"А роза упала на лапу Азора.")
True
票数 4
EN

Code Review用户

发布于 2013-09-28 03:32:00

我认为我们可以用一种更好的方式建立新的字符串:

代码语言:javascript
复制
from string import ascii_letters

def is_palindrome(s):
    new = ''.join(c.lower() for c in s if c in ascii_letters)
    return new[::-1] == new

如果我们想避免从整个字符串中删除非字母,当前几个字符可能足以确定它是否是回文时,我们可能会懒得进行转换。还有一个很好的想法,我们可以把过滤和规范化划分成单独的逻辑。(见像本地人一样循环)

代码语言:javascript
复制
from string import ascii_lowercase
from itertools import izip

def just_lowercase_ascii(s):
    for char in s:
        if char.lower() in ascii_lowercase:
            yield char.lower()

def is_palindrome(s):
    for char1, char2 in izip(just_lowercase_ascii(reversed(s)), just_lowercase_ascii(s):
        if char1 != char2:
            return False
    return True

代码语言:javascript
复制
def is_palindrome(s):
    all(c1 == c2 for c1, c2 in izip(just_lowercase_ascii(reversed(s)),
                                    just_lowercase_ascii(s)

编辑:没有改变参数名称,但字符串是坏的,其他答案指出。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/31928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档