2

数字が単調に増加する順序で整数1を書き込むPythonicで効率的な方法は何ですか?10**6

例えば: (1,2,3,4,5,6,7,8,9,10,11,20,21,22,30,31,32,33,...)

これで仕事は完了しますが、見た目はかなり醜いです。

nums = [10**0*k6 for k6 in range(1,10)] +
       [10**1*k5 + 10**0*k6 for k5 in range(1,10) for k6 in range(k5+1)] + 
       [10**2*k4 + 10**1*k5 + 10**0*k6 
        for k4 in range(1,10) for k5 in range(k4+1) for k6 in range(k5+1)] +
       [10**3*k3 + 10**2*k4 + 10**1*k5 + 10**0*k6
        for k3 in range(1,10) for k4 in range(k3+1) for k5 in range(k4+1) for k6 in range(k5+1)] +
       [10**4*k2 + 10**3*k3 + 10**2*k4 + 10**1*k5 + 10**0*k6
        for k2 in range(1,10) for k3 in range(k2+1) for k4 in range(k3+1) for k5 in range(k4+1) for k6 in range(k5+1)] +
       [10**5*k1 + 10**4*k2 + 10**3*k3 + 10**2*k4 + 10**1*k5 + 10**0*k6
        for k1 in range(1,10) for k2 in range(k1+1) for k3 in range(k2+1) for k4 in range(k3+1) for k5 in range(k4+1) for k6 in range(k5+1)]
4

6 に答える 6

2
def gen(size_digits):
        if size_digits == 0:
            return ( i  for i in range(10) ) 
        else:
            return ( new_dig*(10**size_digits) + old_digit  for old_digit in gen(size_digits-1) for new_dig in range(10) if  new_dig <  int(str(old_digit)[0])   )



l = [ num for num in gen(6) ]
于 2013-05-02T15:34:32.097 に答える
1

ここに(ほぼ)ワンライナーがあります:

from itertools import combinations_with_replacement
from string import digits

lst = sorted(set(int('0' + ''.join(reversed(e))) 
             for e in combinations_with_replacement([''] + list(digits), 6)))[1:]    
print lst

使い方

digitsは文字列0123456789であり、可能なソートされた数字combinations_with_replacementのすべての組み合わせを作成します。空の文字列を追加することで、サイズが 6 以下のすべてのソートされた整数を取得します。

もちろん、数字をソート順ではなく逆順でソートしたいので、各結果を逆にします。しかし、これはリストを並べ替えるので、結果をソートします。

また、空の文字列を使用したトリックにより、いくつかの重複が含まれるため (それほど多くはありません)、set() を使用してそれらを取り除きます。

于 2013-05-02T16:04:18.067 に答える
0

それを行うだけで、より効率的になる可能性があります(パフォーマンス面で):

def xfn():
    x, i = [9], 0

    while True:
        if i == len(x) - 1:
            x.insert(i, 0)

        if x[i] < x[i+1]:
            x[i] += 1
            x[0:i] = [0] * i
            i -= 1
            yield int(''.join(map(str, reversed(x[0:-1]))))
            continue

        i += 1

itertools.takewhile(lambda x: x < 10 ** 6, xfn())
于 2013-05-02T16:55:44.730 に答える
0

これが機能する理由はよくわかりませんが、意図した方法は、数字を取得し、それが適合するように既に生成したすべての数字に追加することです-これは、の右端の数字を見て決定できます数字。

length = 6

digits = range(10)

numbers = digits[1:]
for curNumber in numbers:
    for n in range(1 + curNumber%10):
        numbers.append(curNumber*10 + n)
    if(curNumber == 99999):
        break

print numbers
于 2013-05-02T16:18:41.857 に答える