[英]Why doesn't str(a) == reversed(str(a)) work as a palindrome test in Python?
我一直在嘗試在Python的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)
首先,請嘗試打印出字符串及其假定的反轉-您會發現它們不是您期望的那樣。 獲得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]
)))
盡管當然, 真正的 Python愛好者會希望將其放在一行上:-)為了便於閱讀,我將其拆分了。
Python的reversed
iterator
返回一個iterator
對象。 因此,沒有一個字符串可以等於迭代器。
因為reversed
返回一個iterator
對象,所以您應將str(a) == reversed(str(a))
替換為str(a) == str(a)[::-1]
。 [::-1]
限定詞是一個字符串拼接,它將使集合反向。
讓我從其他所有人指出的內容開始: 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
盡可能多的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.