我一直在尝试用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)
答案 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
returns和iterator
对象。所以,没有一个字符串可以等于迭代器。
答案 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
中的函数。