如何在Y的基础上列出X数字?

时间:2013-10-26 05:36:25

标签: python math

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

我考虑过做以下事情:

  1. 创建一个功能“是每个数字的数字< 2”
  2. 循环超过9999个数字并运行它们的功能。然后添加到列表中。
  3. 为了总结,我想列出所有< x基于3

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

4 个答案:

答案 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)

  1. 制定一条规则,命令所有回复,以便每个回复在彼此之前或之后。

  2. 编写代码以查找第一个回复。

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

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

  5. 现在算法很简单:

    1. 将指标设置为上述2的第一个回复。

    2. 输出指标的当前值。

    3. 如果指标是上述3的最后一个回复,请停止。

    4. 使用上面的4增加指标。

    5. 转到第2步。

    6. 我建议你用数字命令它们,所以四个四位数,它将是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

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