三位数尺寸 N 里程表
Three digit size N odometer
我想生成一个大小为 N 的列表的所有可能输出,该列表充当 3 位里程表。例如,如果 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
您的示例的顺序似乎不正确,因为它首先将第一个数字递增 1,但最后一个数字递增 1。假设您只想将基数 4 中的第一个数字增加 1 和 4 个数字(如果您使用 python 2,请更改打印)[=11=]
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)
简单的方法就是使用 itertools.product
:
import itertools
for odom in itertools.product('0123', repeat=4):
print ''.join(odom)
如果需要先增加第一个数字,可以使用''.join(odom)[::-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)))
我想生成一个大小为 N 的列表的所有可能输出,该列表充当 3 位里程表。例如,如果 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
您的示例的顺序似乎不正确,因为它首先将第一个数字递增 1,但最后一个数字递增 1。假设您只想将基数 4 中的第一个数字增加 1 和 4 个数字(如果您使用 python 2,请更改打印)[=11=]
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)
简单的方法就是使用 itertools.product
:
import itertools
for odom in itertools.product('0123', repeat=4):
print ''.join(odom)
如果需要先增加第一个数字,可以使用''.join(odom)[::-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)))