python数字转列表并顺序输出_有效地创建生成器以按顺序输出数字列表

我想创建一个生成器,输出一个递增数字列表。例如

[1]

[2]

..

[9]

[1,0]

[1,1]

[1,2]

..

[9,9]

[1,0,0]

[1,0,1]

我可以用一种蛮力的方式做到这一点(不完全正确,但在此应用程序中没有关系,前导0):

def generateNumbersStupid():

for x1 in range(10):

for x2 in range(10):

for x3 in range(10):

for x4 in range(10):

for x5 in range(10):

for x6 in range(10):

for x7 in range(10):

for x8 in range(10):

yield [x1,x2,x3,x4,x5,x6, x7, x8]

个人资料

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 56.083 56.083 part2_extended.py:1()

100000000 14.221 0.000 14.221 0.000 part2_extended.py:1(isGrowing)

1278 0.001 0.000 0.004 0.000 part2_extended.py:17(meetsAdjacentCriteria)

100000000 13.181 0.000 27.452 0.000 part2_extended.py:25(isValid)

1278 0.002 0.000 0.003 0.000 part2_extended.py:28(findAdjacents)

100000001 9.726 0.000 10.689 0.000 part2_extended.py:81(generateNumbersStupid)

24310 0.031 0.000 0.046 0.000 part2_extended.py:9(inRange)

1 17.942 17.942 56.083 56.083 part2_extended.py:92(calculateCount)

1 0.000 0.000 56.083 56.083 part2_extended.py:99(main)

6630 0.000 0.000 0.000 0.000 {len}

9524 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}

1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

194480 0.016 0.000 0.016 0.000 {pow}

但我想避免丑陋,并有这样的事情:

def generateNumbersArray(startNumber, endNumber):

for num in range(startNumber, endNumber+1):

number = []

while True:

number.append(num%10)

num //=10

if num == 0:

break

number.reverse()

yield number

但这运行起来明显慢。

还尝试过清洁剂:

def generateNumbersArray(startNumber, endNumber):

for num in range(startNumber, endNumber+1):

yield [int(x) for x in str(num)]

它也明显慢。

如果我尝试将所有内容保留在原位而不生成新的数组,那么它可以使速度大大提高,但速度仍然慢得多。

def generateNumbersArrayInPlace(startNumber, endNumber):

start = [int(x) for x in str(startNumber-1)]

for num in range(startNumber, endNumber):

lastIndex = len(start) - 1

start[lastIndex] = start[lastIndex] + 1

for digit in range(lastIndex, -1, -1):

if start[digit] > 9:

start[digit] = 0

if digit == 0:

start.insert(0,1)

else:

start[digit-1] = start[digit-1] + 1

else:

break

yield start[:]

个人资料

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 49.618 49.618 part2_extended.py:1()

46191900 6.844 0.000 6.844 0.000 part2_extended.py:1(isGrowing)

1278 0.001 0.000 0.004 0.000 part2_extended.py:17(meetsAdjacentCriteria)

46191900 6.827 0.000 13.677 0.000 part2_extended.py:25(isValid)

1278 0.002 0.000 0.003 0.000 part2_extended.py:28(findAdjacents)

46191901 18.352 0.000 26.127 0.000 part2_extended.py:43(generateNumbersArray2)

1278 0.002 0.000 0.003 0.000 part2_extended.py:9(inRange)

1 9.814 9.814 49.618 49.618 part2_extended.py:92(calculateCount)

1 0.000 0.000 49.618 49.618 part2_extended.py:99(main)

46198530 1.865 0.000 1.865 0.000 {len}

9524 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}

1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

10224 0.001 0.000 0.001 0.000 {pow}

我的问题是,是否有一种有效的pythonic方法?

更新:

@ggorlen之类的

def generateNumbersItertools(startRange, endRange):

gen = product([0,1,2,3,4,5,6,7,8,9], repeat=8)

while True:

cur = next(gen)

yield [x for x in cur]

简介:

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 90.430 90.430 part2_extended.py:1()

100000000 14.977 0.000 14.977 0.000 part2_extended.py:1(isGrowing)

1 0.000 0.000 90.430 90.430 part2_extended.py:101(main)

1278 0.001 0.000 0.004 0.000 part2_extended.py:17(meetsAdjacentCriteria)

100000000 14.289 0.000 29.317 0.000 part2_extended.py:25(isValid)

1278 0.002 0.000 0.003 0.000 part2_extended.py:28(findAdjacents)

100000001 34.681 0.000 40.798 0.000 part2_extended.py:62(generateNumbersItertools)

24310 0.032 0.000 0.048 0.000 part2_extended.py:9(inRange)

1 20.315 20.315 90.430 90.430 part2_extended.py:94(calculateCount)

6630 0.000 0.000 0.000 0.000 {len}

9524 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}

1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

100000001 6.116 0.000 6.116 0.000 {next}

194480 0.016 0.000 0.016 0.000 {pow}

也很慢。

解决方案

Without running profiles, just using timeit I saw massive improvement by using itertools.product and by combining that with itertools.dropwhile you no longer have the preceding zeros in the leading lists although the first output will be an empty list this is the closest to what seems your desired output:

generateNumbers = (list(dropwhile((0).__eq__, p)) for p in product(range(10), repeat=8))

This results in:

[]

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[1, 0]

[1, 1]

[1, 2]

[1, 3]

[1, 4]

[1, 5]

[1, 6]

[1, 7]

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值