如何过滤嵌套lis中的条件逻辑元素

2024-09-27 00:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个给定任务的先决条件列表。该列表由构成逻辑表达式的其他任务(使用字母作为占位符)组成。示例如下:

prereqList = [["A", "|", "B"], "&", [["C", "&", "D"], "|", "E"], "&", "F"]

我还有一个已完成任务的列表:

completedTasks = ["A", "C", "F"]

我试图从prereqList中删除已完成的任务,同时遵循条件逻辑。对于上述示例,我希望输出为:

filtered_list = ["D", "|", "E"]

到目前为止我所拥有的:

def filter_prereqs(prereqList, completedTasks):
    ops = {
            "&": (lambda a, b: a in completedTasks and b in completedTasks),
            "|": (lambda a, b: a in completedTasks or b in completedTasks)
        }
        for i in range(prereqList):
            if isinstance(prereqList[i], list):
                filter_prereqs(prereqList[i], completedTasks)
            else:
                if prereqList[i] not in ops.keys():
                    pass
                else:
                    conditionMet = ops[prereqList[i]](prereqList[i-1],prereqList[i+1])
                    if conditionMet:

我一直在想这个问题。任何帮助都将不胜感激!你知道吗


Tags: lambdain示例列表if先决条件逻辑filter
1条回答
网友
1楼 · 发布于 2024-09-27 00:17:17

部分解决方案:

这是可行的,但只适用于“保守地用括号括起来”的表达式。换句话说,它可以解析[["A", "&", "B"], "&", "C"],但不能解析["A", "&", "B", "&", "C"]。所以我不能解析你问题中的精确表达式,但是我可以解析一个逻辑上等价的版本,它有一对额外的括号。你知道吗

#sentinel value that gets returned for an expression that's 100% completed
complete = object()

def remove_completed(expression, completed):
    if isinstance(expression, str):
        if expression in completed:
            return complete
        else:
            return expression
    left, operator, right = expression
    left = remove_completed(left, completed)
    right = remove_completed(right, completed)
    if operator == "|":
        if left is complete or right is complete:
            return complete
        else:
            return [left, "|", right]
    elif operator == "&":
        if left is complete:
            return right
        elif right is complete:
            return left
        else:
            return [left, "&", right]

prereqList = [[["A", "|", "B"], "&", [["C", "&", "D"], "|", "E"]], "&", "F"]
result = remove_completed(prereqList, ["A", "C", "F"])
print(result)

结果:

['D', '|', 'E']

相关问题 更多 >

    热门问题