如何创建所有可能列表的列表,其中n个元素由1到10之间的整数组成?

时间:2016-12-23 17:57:50

标签: python

我正在尝试为我正在进行的项目创建一组测试用例,并且我想创建所有可能的测试用例并迭代它们(快速程序,不应该&# 39; t需要很长时间)。测试用例应该都是长度为1-4的列表,列表中的每个项目应该是0-10之间的整数。列表中的第一项应为0.然后列表集为:

[0]
[0,0]
[0,1]
[0,2]
[0,3]
...
[0,10]
[0,0,0]
[0,0,1]
[0,0,2]
[0,0,3]
...
[0,1,0]
[0,1,1]
[0,1,2]
...
[0,10,10]
...
[0,10,10,10]

这是我到目前为止所做的,但它没有输出正确的列表:

test_list = [0]

for length in range(2, 5):
    while len(test_list) < length:
        test_list.append(0)
    for position in range(1, length):
        for digit in range (0, 11):
            test_list[position] = digit
            print test_list

3 个答案:

答案 0 :(得分:4)

或者您可以使用生成器生成列表;这样你就不会在内存中列出整个列表:

from itertools import product

def gen():
    yield [0]
    for i in range(11):
        yield [0, i]
    for i, j in product(range(11), range(11)):
        yield [0, i, j]
    for i, j, k in product(range(11), range(11), range(11)):
        yield [0, i, j, k]


for item in gen():
    print(item)

对我来说这看起来很可读但是不可扩展(如果你需要更长的列表)这里的其他答案。

因此这里是列表长度可调整的版本:

from itertools import product

def gen(length):
    for l in range(length):
        for tpl in product(range(11), repeat=l):
            yield (0,) + tpl

for item in gen(length=4):
    print(item)

此版本现在返回tuples而不是lists。如果这很重要,你可以用list()来判断返回值。

答案 1 :(得分:2)

我会在嵌套循环中使用itertools.product大小为2,3,4的列表

import itertools

test_list = [0]
for i in range(1,4):
    args = [list(range(0,11))] *i
    test_list += [[0]+list(x) for x in itertools.product(*args)]

# display list
for t in test_list:
    print(t)

答案 2 :(得分:0)

内存高效的单行:

import itertools
size = 4
for x in map(list, itertools.chain(*(itertools.product([0], *[range(11)]*i) for i in range(size)))):
    print(x)

您可以使用任何其他列表大小修改4:)