我有几个使用列表推导生成数学表达式的类。所有这些类都生成具有相似结构的方程,但是存在一些细微差异。总体而言,这是很多代码,并且很难维护。我正在寻找使这段代码更短,更优雅的方法。
下面是一个说明问题的简化示例。 method_1存在于多个类中,但是取决于该类,表达式中的index_sets和exp_conditions会发生变化。
def method_1(index_1):
if some_condition:
exp_1 = min_num-sum([
variable[(index_1, index_2, index_3)] +
variable[(index_2, index_1, index_3)]
for index_2 in index_set_2
for index_3 in index_set_3
if index_1 != index_2 and
if exp_condition_1 and exp_condition_2
])
exp_2 = sum([variable[(index_1, index_2, index_3a)] +
variable[(index_2, index_1, index_3a)]
for index_2 in index_set_2
for index_3 in different_index_set_3
if index_1 != index_2 and
if exp_condition_1 and exp_condition_4
])-max_num
elif some_other_condition:
exp_1 = min_num-sum([
variable[(index_1, index_2, index_3)]
for index_2 in index_set_2
for index_3 in index_set_3
if index_1 != index_2 and
if exp_condition_1 and exp_condition_2
])
exp_2 = sum([variable[(index_1, index_2, index_3a)]
for index_2 in index_set_2
for index_3 in different_index_set_3
if index_1 != index_2 and
if exp_condition_1 and exp_condition_4
])-max_num
else:
exp_1 = self.min_num-sum([
variable[(index_2, index_1, index_3)]
for index_2 in different_index_set_2
for index_3 in index_set_3
if index_1 != index_2 and
if exp_condition_1 and exp_condition_5 and exp_condition_6
])
exp_2 = sum([variable[(index_2, index_1, index_3a)]
for index_2 in index_set_2
for index_3 in different_index_set_3
if index_1 != index_2 and
if exp_condition_1 and exp_condition_5 and exp_condition_6
])-self.max_num
return [exp_1, exp_2]
一贯相同的事情是,根据method_1中的条件,我们总是希望该方法返回两个条件:exp_1和exp_2。
exp_1 = min_num-term_1
exp_2 = term_2-max_num
min_num和max_num是常量,因此它们始终相同。
term_1和term_2是列表理解力的总和。这些列表理解具有类似的结构:
[some_expression for i in ..... for j in .... for x in ... if (list_of_conditions_depending_on_indexes)]
some_expression只能是字典中的值,例如my_dict [(i,j,k)]或字典中值的线性组合,例如my_dict[(i,j,k)]+my_other_dict[(i,j,l,m)]
我认为必须有某种方法可以将传回term_1和term_2的方法作为参数:
如果some_expression和list_of_conditions_depending_on索引不依赖于索引集,那么所有这些都不会成为问题,而我正在努力寻找如何实现这一目标。