Django/Python: 如何使以下数字递增(不在数据库中)

1 投票
2 回答
1844 浏览
提问于 2025-04-15 17:35

我想创建一个像这样的数字:

000000000001

然后把它保存到数据库里。显然,我不能用这种方式在数据库里增加数字(我觉得不行),所以我在寻找一种最有效的方法,从数据库中获取上一个数字,然后加1,来生成下一个记录:

000000000002

以此类推...

如果我手动存储第一个数字,我能不能通过某种手动输入的方式来保持它的零的数量?我甚至不知道该从哪里开始。

2 个回答

1

其实,有一种非常巧妙的方法可以使用itertools库和生成器函数来实现这个功能。

from itertools import product, imap

def stringdigit(num_digits=10, start = None):
    """A generator function which returns string versions of a large iterated number with
    leading zeros. start allows you to define a place to begin the iteration"""
    treatfun = lambda x: ''.join(x)
    for n in imap(treatfun, product('0123456789', repeat = num_digits)):
        if start == None or n > start:
            yield n

这个方法会创建一个迭代器,它会返回你需要的“零填充字符串形式”。它是通过product函数来工作的,这个函数会按“排序顺序”逐步返回可迭代对象中的重复组合。num_digits参数指定你想要返回的总位数。start参数则指定了从哪个地方开始迭代(比如说,如果你想从1111111开始)。

product是从Python 2.6版本开始就有的。如果你因为某种原因在使用更早的版本,可以使用下面这个作为product的定义。具体内容可以在文档中找到,链接在这里

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

你可以在for循环中把这个函数当作迭代器来使用:

for num in stringdigit(num_digits = 7):
    #do stuff with num

希望这对你有帮助。

-Will
7

所有的前导零只是格式问题。

>>> "%012d" % ( 1, )
'000000000001'
>>> "%012d" % ( 2, )
'000000000002'

用一个普通的整数,然后把它格式化成有很多前导零的样子。

撰写回答