我是处理大型数据集的新手,我遇到的问题是List-1中有表达式(如A = B + C的公式),表达式的变量可能有不同的可能值(C = D列表-2中的* 3,C = B / 2,B = D * 50等)。然后List-3具有变量的常量值(B,D等)。我需要计算表达式的所有可能结果(对于C的每个值,类似A可能有两个不同的结果)。 可能的组合可能是巨大的!
我打算按如下方式解决问题 - 1.对于List-1中的每个表达式,查找List-2和中每个变量的所有可能值 在List-4中生成所有可能的表达式。 List-4可能很大,可能是GB或TB!
从第一个生成的列表
在List-3
在表达式中替换常量以获得结果。
第1步和第3步是需要大量内存和CPU的核心问题,任何指导都会受到高度赞赏。
List1:表达式,例如 - A = x + y,y = u + v
List2:包含List1中公式操作数的可能扩展 - 例如:v = 20 + u,v = 30 * u
List3:常数值 - 例如:x = 10,u = 50
A = x + y,y = u + 20 + u,x = 20,u = 10 => y = 40,A = 60 A = x + y,y = u + 30 * u,x = 20,u = 10 => y = 310,A = 330
答案 0 :(得分:0)
您可能需要某种Expression
类型,通常为Add
,Multiply
,Constant
等子类型,加上BoundVariable
和{{ 1}}。
FreeVariable
会有一个Expression
的操作,并将其替换为BoundVariable
的所有实例。
FreeVariable
然后,您可以循环浏览列表的笛卡尔积,并使用已计算的表达式输出标识符。
答案 1 :(得分:0)
假设您的语句是有效的Python语句,那么可以调整以下内容以提供您想要的输出。目前它只是打印变量及其最终值来计算:
from pprint import pprint as pp
# Organse the lists input as sets of simultaneous expressions:
expr_sets_list = ['A = x + y, y = u + 20 + u, x = 20, u = 10',
'A = x + y, y = u + 30*u, x = 20, u = 10' ]
for expr_set_string in expr_sets_list:
# Split into individual expressions on the comma separators
exprs = [expr.strip() for expr in expr_set_string.split(',')]
variables = {} # Accumulates variables and their values
for statement in reversed(exprs): # expressions WILL execute in reverse
exec(statement, {}, variables)
#
print('\n%r =>' % expr_set_string)
pp(variables)
输出:
'A = x + y, y = u + 20 + u, x = 20, u = 10' =>
{'A': 60, 'u': 10, 'x': 20, 'y': 40}
'A = x + y, y = u + 30*u, x = 20, u = 10' =>
{'A': 330, 'u': 10, 'x': 20, 'y': 310}