Трехзначный одометр N
Я хочу сгенерировать все возможные выходные данные из списка размера 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
3 ответа
Решение
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)))
Самый простой способ - просто использовать itertools.product
:
import itertools
for odom in itertools.product('0123', repeat=4):
print ''.join(odom)
Если вам нужно сначала увеличить первую цифру, вы можете использовать ''.join(odom)[::-1]
вместо.
Порядок вашего примера не выглядит правильным, поскольку он начинается с увеличения первой цифры на единицу, но заканчивается увеличением последней цифры на единицу. Предполагая, что вы просто хотите увеличить первую цифру на 1 в базе 4 с 4 цифрами (измените печать, если вы используете 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)