Django/Python: 如何使以下数字递增(不在数据库中)
我想创建一个像这样的数字:
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
希望这对你有帮助。
-Will7
所有的前导零只是格式问题。
>>> "%012d" % ( 1, )
'000000000001'
>>> "%012d" % ( 2, )
'000000000002'
用一个普通的整数,然后把它格式化成有很多前导零的样子。