如何在 python 上存储和读取我的逻辑操作
How to store and read my logical operation on python
我正在制作一个程序,使用一些参数和逻辑操作来过滤我的数据。
我有很多班级数据,每个班级都有自己的特点,所以每个班级都会有不同的过滤器。
if classrooms == 1:
if data[A] > data[B] & data[C] != data [D]:
print("matched")
elif classrooms == 2:
if data[A] < data[B] & data[C] == data [D]:
print("matched")
elif classrooms == 3:
if data[B] < data[D] & data[A] == data [C]:
print("matched")
...
...
elif classrooms == 5000:
if data[R] < data[A] & data[W] == data [H]:
print("matched")
由于运算符相似,有什么方法可以将我的逻辑过滤器从我存储的文件中读取到python程序中吗?
"(A<B)&(C!=D)"
"(A>B)&(C==D)"
..
..
"(R<A)&(W==H)"
因此,我不必为 python 中的每个教室编写我所有的逻辑过滤器,这会导致 python 中出现大行。我刚刚从我存储的文本数据中读取,我的 python 程序将解释
"(A<B)&(C!=D)"
参加这个节目
if data[A] > data[B] & data[C] != data [D]:
您可以使用 regular expression 解析文件中的过滤器,然后从运算符模块构造一个函数链来执行过滤器。
这个表达式
import re
rx = re.compile(r"""^ # Beginning of string
\( # Opening outer parenthesis
(?P<operand0>[A-Z]) # First operand
(?P<operator0>[^A-Z]+) # First operator
(?P<operand1>[A-Z]) # Second operand
\) # Closing outer parenthesis
(?P<operator1>[^A-Z]+) # Second operator
\( # Opening oute parenthesis
(?P<operand2>[A-Z]) # Third operand
(?P<operator2>[^A-Z]+) # Third operator
(?P<operand3>[A-Z]) # Fourth operand
\) # Closing outer parenthesis
$ # End of string
""",
re.VERBOSE)
与您的过滤器结构相匹配。
他们可以这样匹配:
m = rx.match("(A<B)&(C!=D)")
可以使用在 (?P<name>)
子表达式
中分配的名称来访问部分过滤器
m['operand0']
'A'
m['operator0']
'<'
使用字典将运算符映射到 operator 模块中的函数
import operator
lookup = {
'<': operator.lt,
'&': operator.and_,
'!=': operator.ne,
}
您可以构建表达式并对其求值
op0 = lookup[m['operator0']]
op1 = lookup[m['operator1']]
op2 = lookup[m['operator2']]
result = op1(op0(a, b), op2(c, d))
如何从操作数中导出 a, b, c, d
是您需要解决的问题。
上面的正则表达式假定操作数是单个大写字符,运算符是一个或多个非大写字符。这可以更精确,例如,您可以使用正则表达式交替运算符 |
来创建仅匹配使用的运算符
的表达式
r'&|<|>|!=|=='
而不是过于笼统
r'[^A-Z]+'
我正在制作一个程序,使用一些参数和逻辑操作来过滤我的数据。
我有很多班级数据,每个班级都有自己的特点,所以每个班级都会有不同的过滤器。
if classrooms == 1:
if data[A] > data[B] & data[C] != data [D]:
print("matched")
elif classrooms == 2:
if data[A] < data[B] & data[C] == data [D]:
print("matched")
elif classrooms == 3:
if data[B] < data[D] & data[A] == data [C]:
print("matched")
...
...
elif classrooms == 5000:
if data[R] < data[A] & data[W] == data [H]:
print("matched")
由于运算符相似,有什么方法可以将我的逻辑过滤器从我存储的文件中读取到python程序中吗?
"(A<B)&(C!=D)"
"(A>B)&(C==D)"
..
..
"(R<A)&(W==H)"
因此,我不必为 python 中的每个教室编写我所有的逻辑过滤器,这会导致 python 中出现大行。我刚刚从我存储的文本数据中读取,我的 python 程序将解释
"(A<B)&(C!=D)"
参加这个节目
if data[A] > data[B] & data[C] != data [D]:
您可以使用 regular expression 解析文件中的过滤器,然后从运算符模块构造一个函数链来执行过滤器。
这个表达式
import re
rx = re.compile(r"""^ # Beginning of string
\( # Opening outer parenthesis
(?P<operand0>[A-Z]) # First operand
(?P<operator0>[^A-Z]+) # First operator
(?P<operand1>[A-Z]) # Second operand
\) # Closing outer parenthesis
(?P<operator1>[^A-Z]+) # Second operator
\( # Opening oute parenthesis
(?P<operand2>[A-Z]) # Third operand
(?P<operator2>[^A-Z]+) # Third operator
(?P<operand3>[A-Z]) # Fourth operand
\) # Closing outer parenthesis
$ # End of string
""",
re.VERBOSE)
与您的过滤器结构相匹配。
他们可以这样匹配:
m = rx.match("(A<B)&(C!=D)")
可以使用在 (?P<name>)
子表达式
m['operand0']
'A'
m['operator0']
'<'
使用字典将运算符映射到 operator 模块中的函数
import operator
lookup = {
'<': operator.lt,
'&': operator.and_,
'!=': operator.ne,
}
您可以构建表达式并对其求值
op0 = lookup[m['operator0']]
op1 = lookup[m['operator1']]
op2 = lookup[m['operator2']]
result = op1(op0(a, b), op2(c, d))
如何从操作数中导出 a, b, c, d
是您需要解决的问题。
上面的正则表达式假定操作数是单个大写字符,运算符是一个或多个非大写字符。这可以更精确,例如,您可以使用正则表达式交替运算符 |
来创建仅匹配使用的运算符
r'&|<|>|!=|=='
而不是过于笼统
r'[^A-Z]+'