Python自动化

时间:2018-06-12 03:00:25

标签: python algorithm for-loop if-statement

以下问题可能有点令人困惑,但我会尽力以最佳方式解释。

我们假设我们为一家制造公司工作。其中制造用于制造产品的组件。在以下示例中,有3个组件和2个最终产品。

组件和产品的需求如下:

comp1 = 8
comp2 = 3
comp3 = 5
prod1 = 2
prod2 = 2

可以保存在字典中:

clst = {"comp": [comp1, comp2, comp3], "prod": [prod1, prod2]}

另一方面,为了制造最终产品,组件要求如下:

prod1需要:2 comp1,1 comp2,1 comp3

prod2需要:3 comp1,1 comp2,2 comp3

在字典中:

rprod = {0: [2,1,1], 1: [3,1,2]}

我需要创建一个列表,其中包含以下列方式混合数据的材料的贡献和消耗列表:

[
    [
        [1, 1, 1, 1, 1, 1, 1, 1, -2],            # ---->comp1/prod1(1)
                 [1, 1, 1, -1],               # ---->comp2/prod1(1)
                [1, 1, 1, 1, 1, -1]         # ---->comp3/prod1(1)
    ]
    ,
    [
        [1, 1, 1, 1, 1, 1, 1, 1, -2],            # ---->comp1/prod1(2)
                 [1, 1, 1, -1],               # ---->comp2/prod1(2)
                [1, 1, 1, 1, 1, -1]         # ---->comp3/prod1(2)
    ]
    ,
    [
        [1, 1, 1, 1, 1, 1, 1, 1, -3],            # ---->comp1/prod2(1)
                 [1, 1, 1, -1],               # ---->comp2/prod2(1)
                [1, 1, 1, 1, 1, -2]         # ---->comp3/prod3(1)
    ]
    ,
    [
        [1, 1, 1, 1, 1, 1, 1, 1, -3],            # ---->comp1/prod2(2)
                 [1, 1, 1, -1],               # ---->comp2/prod2(2)
                [1, 1, 1, 1, 1, -2]         # ---->comp3/prod3(2)
    ]
]

列表中的数量1对应于组件的需求数量,负数的最终数量是产品组件的要求。

有关列表的任何建议吗?

2 个答案:

答案 0 :(得分:2)

In[2]: comp1 = 8
  ...: comp2 = 3
  ...: comp3 = 5
  ...: prod1 = 2
  ...: prod2 = 2
  ...: 
  ...: clst = {"comp": [comp1, comp2, comp3], "prod": [prod1, prod2]}
  ...: rprod = {0: [2,1,1], 1: [3,1,2]}
In[3]: result = []
  ...: for i, p in enumerate(clst['prod']):
  ...:     for _ in range(p):
  ...:         tmp = [([1] * a) + [-b] for a, b in zip(clst['comp'], rprod[i])]
  ...:         result.append(tmp)
  ...: 
In[4]: result
Out[4]: 
[[[1, 1, 1, 1, 1, 1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, 1, 1, -1]],
 [[1, 1, 1, 1, 1, 1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, 1, 1, -1]],
 [[1, 1, 1, 1, 1, 1, 1, 1, -3], [1, 1, 1, -1], [1, 1, 1, 1, 1, -2]],
 [[1, 1, 1, 1, 1, 1, 1, 1, -3], [1, 1, 1, -1], [1, 1, 1, 1, 1, -2]]]

答案 1 :(得分:1)

以下是代码的可读格式:

rprod = {0: [2,1,1], 1: [3,1,2]}
clst = {"comp": [8, 3, 5], "prod": [2, 2]}

lst = []

for i, prod_demand in enumerate(clst["prod"]):
    sub_list = []
    for j, comp_demand in enumerate(clst["comp"]):
        sub_list.append([1]*comp_demand+[rprod[i][j]*(-1)])
    for k in range(prod_demand):
        lst.append(sub_list)

但如果你想浓缩它,你可以写:

rprod = {0: [2,1,1], 1: [3,1,2]}
clst = {"comp": [8, 3, 5], "prod": [2, 2]}

lst = []

for i, p in enumerate(clst["prod"]):
    lst += [[[1]*c+[rprod[i][j]*(-1)] for j, c in enumerate(clst["comp"])]]*p