-2

我必须在 Python 中创建一个长度为 X 的所有数字的列表,其中每个数字小于 3。例如,长度为 4: [[0000],[0001],[0002],[0010],[0011],...]等等。我有一些想法。但我想不出任何好的、高性能的解决方案。

我想过做以下事情:

  1. 创建一个函数“每个数字的位数 < 2”
  2. 循环 9999 个数字并对其运行函数。然后添加到列表中。

总结一下,我想列出所有 < x 以 3 为底的数字

编辑:这可以帮助:[(x,y,z) for x in xrange(3) for y in xrange(3) for z in xrange(3)]。对我来说,outpot 在发电机中更好。但这个答案不是动态的。我不能改变它的长度。

4

4 回答 4

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)]
于 2013-10-26T06:05:53.790 回答
3

使用itertools.product

[''.join(map(str,tup)) for tup in product(range(3),repeat=4)]

我将它们加入字符串,因为 [0000] 将仅显示为 [0]。您可以将它们保留为元组并摆脱所有join(map(str...笨拙的东西。在这种情况下,您甚至不需要列表组合,它只是

list(product(range(4),repeat=3))
于 2013-10-26T06:07:45.273 回答
1
  1. 想出一个规则,对所有响应进行排序,以便每个响应都在彼此之前或之后。

  2. 编写代码以找到第一个响应。

  3. 编写代码以确定响应是否是最后一个响应。

  4. 编写代码以将响应转换为下一个响应。

现在算法很简单:

  1. 为上面的第一个响应设置一个指示器2

  2. 输出指标的当前值。

  3. 如果指标是3上面的最后一个响应,则停止。

  4. 4使用上述增加指标。

  5. 转到第 2 步。

我建议您按数字顺序排列它们,所以四个四位数,即 0000、0001、0002、0010、0011 等等。然后第一个响应全为零。最后的反应是全是二。这只是留下了编写代码以递增到下一个响应的问题。

于 2013-10-26T05:39:34.637 回答
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

到任何基数和您想要的位数。

于 2013-10-26T06:01:06.433 回答