我必须在Python中创建一个长度为X的所有数字的列表,其中每个数字都小于3.例如,长度为4:
[[0000],[0001],[0002],[0010],[0011],...]
等等..
我有一些想法。但我想不出任何好的,高效的解决方案。
我考虑过做以下事情:
为了总结,我想列出所有< x基于3
编辑:
这有助于:[(x,y,z) for x in xrange(3) for y in xrange(3) for z in xrange(3)]
。
对于我来说,outpot在发电机中更好。但这个答案并不是动态的。我不能改变它的长度。
答案 0 :(得分:3)
以下内容并不完全符合您的要求,但它很接近:
from itertools import product
def create_list(x):
return list(product(range(3), repeat=x))
print create_list(3)
这将打印:
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2),
(0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2),
(1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2),
(2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2),
(2, 2, 0), (2, 2, 1), (2, 2, 2)]
答案 1 :(得分:3)
使用itertools.product
:
[''.join(map(str,tup)) for tup in product(range(3),repeat=4)]
我将它们加入到字符串中,因为[0000]只显示为[0]。你可以把它们留作元组并摆脱所有join(map(str...
mumbo jumbo。在这种情况下,你甚至不需要列表comp,它只是
list(product(range(4),repeat=3))
答案 2 :(得分:1)
制定一条规则,命令所有回复,以便每个回复在彼此之前或之后。
编写代码以查找第一个回复。
编写代码以确定响应是否是最后一个响应。
编写代码以将响应转换为下一个响应。
现在算法很简单:
将指标设置为上述2
的第一个回复。
输出指标的当前值。
如果指标是上述3
的最后一个回复,请停止。
使用上面的4
增加指标。
转到第2步。
我建议你用数字命令它们,所以四个四位数,它将是0000,0001,0002,0010,1211等。第一个响应是全零。最后的回答是全部两个。这就留下了编写代码以增加到下一个响应的问题。
答案 3 :(得分:1)
inputBase, expectedSize = 2, 3
def convertToBase(num, base):
result, current = [], 0
if not num: result.append(0)
while num:
result.append((num % base))
current += 1
num /= base
result.reverse()
return result, current
currentNum, result = 0, []
while True:
based, size = convertToBase(currentNum, inputBase)
if size > expectedSize: break
while len(based) < expectedSize:
based.insert(0, 0)
result.append(based)
currentNum += 1
print result
<强>输出:强>
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
只需更改
inputBase, expectedSize = 2, 3
到任何基数和你想要的位数。