首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回文生成器

回文生成器
EN

Stack Overflow用户
提问于 2013-07-03 04:39:13
回答 3查看 7.5K关注 0票数 1

一般来说,我对python和编程缺乏经验。

我正在尝试创建一个函数,它可以生成一个回文数字列表,直到指定的限制。

当我运行下面的代码时,它返回一个空的list []。不知道为什么会这样。

代码语言:javascript
复制
def palin_generator():
    """Generates palindromic numbers."""

    palindromes=[]
    count=0
    n=str(count)

    while count<10000:
        if n==n[::-1] is True:
            palindromes.append(n)
            count+=1
        else:
            count+=1

    print palindromes  
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-03 04:43:15

您的if语句并没有做您认为它做的事情。

您正在应用运算符链,并且您正在测试两件事:

代码语言:javascript
复制
(n == n[::-1]) and (n[::-1] is True)

这将始终为False,因为'0' is True不是True。演示:

代码语言:javascript
复制
>>> n = str(0)
>>> n[::-1] == n is True
False
>>> n[::-1] == n 
True

comparisons documentation

比较可以任意链接,例如,x < y <= z等同于x < y and y <= z,只是y只评估一次(但在这两种情况下,当z被发现为假时,根本不评估x < y )。

您不需要在这里测试is True;Python的if语句完全能够自己测试:

代码语言:javascript
复制
if n == n[::-1]:

您的下一个问题是从不更改n,所以现在您将向列表追加1000个'0'字符串。

最好在xrange(1000)上使用for循环,并在每次迭代时设置n

代码语言:javascript
复制
def palin_generator():
    """Generates palindromic numbers."""

    palindromes=[]

    for count in xrange(10000):
        n = str(count)
        if n == n[::-1]:
            palindromes.append(n)

    print palindromes  

现在你的函数可以工作了:

代码语言:javascript
复制
>>> palin_generator()
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '11', '22', '33', '44', '55', '66', '77', '88', '99', '101', '111', '121', '131', '141', '151', '161', '171', '181', '191', '202', '212', '222', '232', '242', '252', '262', '272', '282', '292', '303', '313', '323', '333', '343', '353', '363', '373', '383', '393', '404', '414', '424', '434', '444', '454', '464', '474', '484', '494', '505', '515', '525', '535', '545', '555', '565', '575', '585', '595', '606', '616', '626', '636', '646', '656', '666', '676', '686', '696', '707', '717', '727', '737', '747', '757', '767', '777', '787', '797', '808', '818', '828', '838', '848', '858', '868', '878', '888', '898', '909', '919', '929', '939', '949', '959', '969', '979', '989', '999', '1001', '1111', '1221', '1331', '1441', '1551', '1661', '1771', '1881', '1991', '2002', '2112', '2222', '2332', '2442', '2552', '2662', '2772', '2882', '2992', '3003', '3113', '3223', '3333', '3443', '3553', '3663', '3773', '3883', '3993', '4004', '4114', '4224', '4334', '4444', '4554', '4664', '4774', '4884', '4994', '5005', '5115', '5225', '5335', '5445', '5555', '5665', '5775', '5885', '5995', '6006', '6116', '6226', '6336', '6446', '6556', '6666', '6776', '6886', '6996', '7007', '7117', '7227', '7337', '7447', '7557', '7667', '7777', '7887', '7997', '8008', '8118', '8228', '8338', '8448', '8558', '8668', '8778', '8888', '8998', '9009', '9119', '9229', '9339', '9449', '9559', '9669', '9779', '9889', '9999']
票数 3
EN

Stack Overflow用户

发布于 2013-11-08 18:49:32

遍历所有的数字是非常低效的。您可以像这样生成回文:

代码语言:javascript
复制
#!/usr/bin/env python
from itertools import count

def getPalindrome():
    """
        Generator for palindromes.
        Generates palindromes, starting with 0.
        A palindrome is a number which reads the same in both directions.
    """
    yield 0
    for digits in count(1):
        first = 10 ** ((digits - 1) // 2)
        for s in map(str, range(first, 10 * first)):
            yield int(s + s[-(digits % 2)-1::-1])

def allPalindromes(minP, maxP):
    """Get a sorted list of all palindromes in intervall [minP, maxP]."""
    palindromGenerator = getPalindrome()
    palindromeList = []
    for palindrome in palindromGenerator:
        if palindrome > maxP:
            break
        if palindrome < minP:
            continue
        palindromeList.append(palindrome)
    return palindromeList

if __name__ == "__main__":
    print(allPalindromes(4456789, 5000000))

这段代码比上面的代码快得多。

另请参阅:Python 2.x remarks

票数 3
EN

Stack Overflow用户

发布于 2013-07-03 04:41:52

if代码块检查n是否为回文类型,并且n的值永远不会改变。它只被分配一次。

此外,您还可以删除is True部件,因为它是多余的。

但这不是你现在问题的根源。事实上,您的if失败的原因是操作符优先。你现在写的东西等同于if n==(n[::-1] is True):,也就是if n==False:,这是永远不会发生的。

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

https://stackoverflow.com/questions/17435448

复制
相关文章

相似问题

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