从数字列表创建模式

时间:2019-10-29 15:57:35

标签: python algorithm list sequence

我有一个元素范围从0到3的列表。我想创建一个列表模式,使得如果存在0,则不更改任何值,如果存在1,则更改值从0到1。如果有2,则将其值从0、1和2更改。这听起来可能令人困惑,但是总的来说,我想生成一个像这样的模式:

input_list = [0, 0, 0, 0]
output = [0, 0, 0, 0] # Since input only has 0s we do not permute their values.

input_list = [1,0,0,0]
output = [0,0,0,0], [1,0,0,0] # We can permute the values of the 1 present.

input_list = [1,0,0,1]
output = [0,0,0,0], [1,0,0,0], [0,0,0,1], [1,0,0,1]

在列表包含2的情况下,我们将其值从0-1-2置换

input_list = [2,0,0,0]
output = [0,0,0,0], [1,0,0,0], [2,0,0,0]

input_list = [1,0,0,2]
output = [0,0,0,0], [1,0,0,0], [0,0,0,1], [1,0,0,1], [0,0,0,2], [1,0,0,2]

如果列表中存在3,则输出类似。

对于如何解决此问题,我不确定。任何帮助都会很棒。

P.S。这不是作业问题。我正在从事一个研究项目,并且需要一些类似的模式来进行某些模拟。复杂度不是问题,但是会倾向于低复杂度的解决方案。 :D

2 个答案:

答案 0 :(得分:4)

from itertools import product
input_list = [1,0,0,2]

list( product(*(range(x+1) for x in input_list)) )

输出:

[(0, 0, 0, 0),
 (0, 0, 0, 1),
 (0, 0, 0, 2),
 (1, 0, 0, 0),
 (1, 0, 0, 1),
 (1, 0, 0, 2)]

答案 1 :(得分:1)

这是一个可能的解决方案:

input_list = [1, 0, 0, 2]
outputs = []

def get_outputs(input_list):
    if len(input_list) == 0:
        return [[]]
    first = input_list[0]
    outputs = get_outputs(input_list[1:])
    result = [[0] + out for out in outputs]
    if first >= 1:
        result += [[1] + out for out in outputs]
    if first >= 2:
        result += [[2] + out for out in outputs]
    if first == 3:
        result += [[3] + out for out in outputs]
    return result

print(get_outputs(input_list))

解决方案未优化。在大型列表上运行可能需要一段时间。任何改进或建议都将受到高度赞赏。