Python 如何更有效地创建数字递增的整数?

Python 如何更有效地创建数字递增的整数?,python,python-3.x,algorithm,Python,Python 3.x,Algorithm,上面的代码提供了数字按升序排列的整数列表。但随着位数的增加,它的效率会降低。有没有办法让代码更高效?我们能让它适用于超过30位的数字吗 def gen_dig(digits): """Assumes digits is an integer; Returns a list containing integers with digits in ascending order""" lst=[] start=int('1'+'0'*digits) end=in

上面的代码提供了数字按升序排列的整数列表。但随着位数的增加,它的效率会降低。有没有办法让代码更高效?我们能让它适用于超过30位的数字吗

def gen_dig(digits):
    """Assumes digits is an integer;
    Returns a list containing integers with digits in ascending order"""
    lst=[]
    start=int('1'+'0'*digits)
    end=int('1'+'0'*(digits+1))
    for num in range(start,end):
        if str(num)==''.join(sorted(str(num))):
            lst.append(num)
    return lst

关于算法的建议:

  • 获取起始编号,例如2004050
  • 从开头开始,将小于第一个数字的所有数字设置为第一个数字的值,即2224252
  • 从第二个数字(仍然是2224252)、第三个数字(仍然是2224252)、第四个数字(2224454)一直重复到最后一个数字(2224455
这样你就得到了下一个增加的数字。让它成为一种方法。你会注意到你甚至可以稍微调整一下

之后,在数字上加1,并对每个数字重复该过程。你会得到2224456,2224457,2224458,2224459

当达到2224460时,将转换为下一个递增的2224466


我不确定它是否适用于10^30范围内的数字,但它至少会在开始时跳过11%的数字(1000…到1111…)。这应该在中午12点再次发生。。。到1222年。。。依此类推,所以它可能足够快。

一种带递归的方法:

str_numbers = '0123456789'

def generate(number):
    yield from helper(number + 1, 1)

def helper(num_pos, num_from):
    if num_pos == 1:
        yield from str_numbers[num_from:]
    else:
        for i in range(num_from, 10):
            for n in helper(num_pos-1, i):
                yield str(i) + n

for i, num in enumerate(generate(10)):
    print(i, num)
印刷品:

0 11111111111
1 11111111112
2 11111111113
3 11111111114
4 11111111115
5 11111111116

...

75575 88888899999
75576 88888999999
75577 88889999999
75578 88899999999
75579 88999999999
75580 89999999999
75581 99999999999

使用
timeit
快速基准测试:

from timeit import timeit

t1 = timeit(lambda: gen_dig(6), number=1)
t2 = timeit(lambda: list(generate(6)), number=1)

print(t1)
print(t2)
在我的机器上打印:

6.965828249998594
0.009299607001594268

一种解决方案是使用
itertools。组合\u和替换\u

from itertools import combinations_with_replacement

for comb in combinations_with_replacement("123456789", num_digits):
    print(''.join(comb))
注意根据

如果对输入iterable进行排序,则组合元组将 按顺序生产的

因此,输出的顺序是有保证的


同时,doc中的等效实现表明,在每个输出组合元组中,元素遵循与输入iterable相同的顺序。因此,每个输出组合中的数字顺序也是有保证的。

能否添加示例输入和所需输出?您需要选择更好的算法。不管你如何加速,这种蛮力方法都会很慢。@MarkRansom,我知道它效率很低。但我想不出比这更好的算法了。不要通读所有的数字,检查它们是否符合要求。首先只生成满足要求的数字。您真的想要所有这些数字吗?或者你只是想知道有多少?我想,OP可以自己实现。但知道你们提供免费的编码服务也很好。@ThomasWeller我试图提高效率,但因为生成(20)需要19秒。对于
30
我还没有试过。我会把第一行写成
stru numbers='0123456789'
。“简单多了!”AndrejKesely说,代码运行得很顺利。今天学到了一些新东西