为什么str(a)== reverse(str(a))不能在Python中作为回文测试?

时间:2016-01-07 04:42:51

标签: python

我一直在尝试用Python中的Project Euler找到问题#4的答案,但我似乎无法在我的代码中找到问题。这是一个问题:

  

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。   找到由两个3位数字的乘积制成的最大回文。

这是我的代码:

nums = list(range(10000, 998001))

pals = []
def palindrome(a):
    if str(a) == reversed(str(a)):
        pals.append(a)

for every in nums:
    palindrome(every)

4 个答案:

答案 0 :(得分:3)

首先,尝试打印出字符串及其假定的反转 - 你会发现它们并不像你期望的那样。获得s字符串反转的更合理方法是使用s[::-1]

然后你需要意识到你正在检查你那个范围内的每个号码10000..998000(注意我已经遗漏了998001,因为Python范围是最后独家)。不所有这些数字将是两个3位数字的乘积。当然,一旦你得到了所有的回文,这可能是你的下一步,在这种情况下,你可以随意忽略这一段(当然,除了确定范围之外)。

另外,我可能不会将该范围包装在列表中。如果您使用的是Python 2,那么已经一个列表,对于Python 3,最好将它留作惰性迭代器,以免浪费内存。

而且,作为最后的一点,我可能不会这样做,因为我更喜欢可读的代码,但那些要求“Pythonic”解决方案的人可能会喜欢这样的东西:

print(max((i*j
    for i in range(100,1000)
    for j in range(100,1000)
    if str(i*j) == str(i*j)[::-1]
    )))

虽然当然 true Python爱好者会想要一行:-)我为了便于阅读而将其分开。

答案 1 :(得分:2)

Python reversed returnsiterator对象。所以,没有一个字符串可以等于迭代器。

答案 2 :(得分:0)

由于reversed会返回iterator个对象,因此您应将str(a) == reversed(str(a))替换为str(a) == str(a)[::-1][::-1]限定符是一个字符串拼接,它将反转集合。

答案 3 :(得分:0)

让我先从其他人指出的内容开始:reversed(s)s[::-1]不同。

其他人都希望您使用s[::-1]代替reversed()。当然,这个建议是可疑的和惯用的。但为什么限制自己!毕竟这是Python。

from itertools import combinations, ifilter, imap, starmap
from operator import eq, mul

def is_palindrome(integer):
    """Returns a True if an input integer's digits are palindromic, False otherwise."""
    string = str(integer) 
    return all(imap(eq, iter(string), reversed(string)))

def largest_palindrome_product(n_digits=3):
    """Solves Project Euler #4"""
    all_n_digit_numbers = xrange(10**(n_digits)-1, 10**(n_digits-1), -1)
    palindromes = ifilter(is_palindrome, 
                          (starmap(mul, combinations(all_n_digit_numbers, 2)))
                         )
    return max(palindromes)

largest_palindrome_product()

此解决方案具有保留reversed()使用的宝贵功能!为了获得额外的难以理解,我尝试尽可能多地使用itertools中的函数。