pandas 如何高效制作综合作文表

mlnl4t2r  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(100)

我试图根据具体的规则为复合材料的发展(在化学领域)制定一个全面的组成表。
规则是

  • 表中的数字表示复合材料中每种原材料的重量百分比
  • 有三种原材料(A、B、C),我最多可以用两种材料来制作复合材料
  • 表中的每个数字必须是x的倍数,每行的和必须小于或等于y
  • 我必须写出符合上述规则的每一种可能的组合。

例如,如果x=1和y=2,我可以制作一个如下所示的表格。

Material A  Material B  Material C
Composite1          0           0           0
Composite2          1           0           0
Composite3          0           1           0
Composite4          0           0           1
Composite5          1           1           0
Composite6          1           0           1
Composite7          0           1           1
Composite8          2           0           0
Composite9          0           2           0
Composite10         0           0           2

(实际上,材料D的重量百分比被省略,因此没有必要认为一行的总和不是100。
当x和y是小数字时,我可以手动制作表格(使用Excel),但如果x和y是大数字,我就不能。因此,我想知道Python代码,它可以有效地制作表格,而不管x和y。

blmhpbnm

blmhpbnm1#

您可以使用itertools.product,然后使用list comprehension过滤掉超出限制的组合。

import itertools

def get_compositions(raw_materials:list, factor_x:int,lim_y:int,col_prefix='Material '):
    multiples = [factor_x*i for i in range(int(lim_y/factor_x)+1)]
    cart_prod = itertools.product(multiples, repeat=len(raw_materials))
    composites = [c for c in cart_prod if sum(c)<=lim_y] ## filter

    composite_labels = [f'Composite{i}' for i in range(1, len(composites)+1)]
    material_labels = [f'{col_prefix}{m}' for m in raw_materials]

    return pd.DataFrame(composites, index=composite_labels, columns=material_labels)

**get_compositions(['A', 'B','C'], 1, 2)**应返回

相关问题