簡體   English   中英

為什么str(a)== reversed(str(a))不能在Python中用作回文測試?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM