1

3 桁の走行距離計として機能するサイズ N のリストのすべての可能な出力を生成したいと考えています。たとえば、N = 4 の場合、次の出力が必要です。

0000 1000 2000 3000 0100 1100 ... 3332 3333.

これが私のコードです。どんな助けも大歓迎です!

odom = [0]*N  ## initialize odometer
print odom
while odom[N-1] <= 3:
    idx = 1
    odom[0] += 1
    if odom[0] > 3:
        while odom[idx] > 3:
            idx += 1
        for i in range(idx):
            odom[i] = 0
    print odom
4

3 に答える 3

1
def foo(n, digits = 4):
    if digits == 0:
        return ''
    msb, lsb = divmod(n, 4)
    return str(lsb) + foo(msb, digits - 1)

result = []
number_of_digits = 4
maxn = sum(3 * pow(number_of_digits,n) for n in range(number_of_digits))

for n in range(maxn + 1):
    result.append(foo(n, number_of_digits))

result = [foo(n, number_of_digits) for n in range(maxn + 1)]

foo_4 = functools.partial(foo, digits=4)
result = list(map(foo_4, range(maxn + 1)))
于 2016-11-23T23:30:26.800 に答える
1

簡単な方法は、次を使用することitertools.productです。

import itertools
for odom in itertools.product('0123', repeat=4):
    print ''.join(odom)

最初の桁を最初にインクリメントする必要がある場合は、''.join(odom)[::-1]代わりに使用できます。

于 2016-11-23T22:50:00.690 に答える
0

あなたの例の順序は、最初の桁を1つ増やすことから始まりますが、最後の桁を1つ増やすことで終わるため、正しくないようです。4桁の基数4で最初の桁を1だけ増やしたいと仮定します(python 2を使用している場合は印刷を変更してください)

import numpy as np

def odo(numdigits, maxdigit):
    x = 1
    while len(np.base_repr(x, base=maxdigit)) <= numdigits:
        padding = numdigits - len(np.base_repr(x, base=maxdigit))
        yield np.base_repr(x, base=maxdigit, padding=padding)[::-1]
        x += 1

for x in odo(4, 4):
    print(x)
于 2016-11-23T22:45:07.983 に答える