用m种颜色着色n个盒子

时间:2017-02-14 09:10:54

标签: python numpy itertools

我有n个盒子,我想用米色为它们着色。我想允许重复颜色。例如给出4个盒子和两种颜色。将颜色表示为1和2,我们有以下方法为它们着色

[[1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 2, 1], [1, 1, 2, 2], [1, 2, 1, 1], 
[1, 2, 1, 2], [1, 2, 2, 1], [1, 2, 2, 2], [2, 1, 1, 1], [2, 1, 1, 2],
[2, 1, 2, 1], [2, 1, 2, 2], [2, 2, 1, 1], [2, 2, 1, 2], [2, 2, 2, 1],
[2, 2, 2, 2]]

其中例如[1,1,1,1]表示带有第一种颜色的着色框1,带有第一种颜色的框2表示最后一个框。虽然[1,1,2,1]表示带有颜色1的着色盒1,2和4,而带有颜色2的盒子3。

为此,我定义了以下功能

def recursive_fun(number_of_boxes,number_of_colors):
      possible_colors=range(1,number_of_colors+1)
      if number_of_boxes==1:
          return [[i] for i in possible_colors]
      else:
          output=[] 
          y=recursive_fun(number_of_boxes-1,number_of_colors)
          for i in y:
               for m in possible_colors:
                     output.append(i+[m])
      return output

该功能正在运行,但我希望有一种更有效的方法。有没有办法使用itertools包来做到这一点?

1 个答案:

答案 0 :(得分:2)

你的意思是itertools.product

import itertools

colours = (1, 2)

for x in itertools.product(colours, repeat=4):
    print(x)

打印:

(1, 1, 1, 1)
(1, 1, 1, 2)
(1, 1, 2, 1)
(1, 1, 2, 2)
(1, 2, 1, 1)
(1, 2, 1, 2)
(1, 2, 2, 1)
(1, 2, 2, 2)
(2, 1, 1, 1)
(2, 1, 1, 2)
(2, 1, 2, 1)
(2, 1, 2, 2)
(2, 2, 1, 1)
(2, 2, 1, 2)
(2, 2, 2, 1)
(2, 2, 2, 2)