从数字列表创建模式
Create a pattern from a list of numbers
我有一个包含 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
这是一个可能的解决方案:
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))
解决方案未优化。在大名单上 运行 可能需要一段时间。非常感谢任何改进或建议。
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)]
我有一个包含 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
这是一个可能的解决方案:
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))
解决方案未优化。在大名单上 运行 可能需要一段时间。非常感谢任何改进或建议。
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)]