如何在python上存储和读取我的逻辑操作

2024-06-16 08:41:01 发布

您现在位置: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]:

Tags: 文件数据方法文本程序过滤器data参数
1条回答
网友
1楼 · 发布于 2024-06-16 08:41:01

您可以使用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是您需要解决的问题

上面的正则表达式假设操作数是单个大写字符,运算符是一个或多个非大写字符。这可以变得更精确,例如,您可以使用regex交替运算符|来生成只匹配所使用运算符的表达式

r'&|<|>|!=|=='

而不是过于笼统

r'[^A-Z]+'

相关问题 更多 >