如何过滤掉嵌套列表中的条件逻辑元素
How to filter out conditional logic elements in a nested list
我有一份给定任务的先决条件列表。该列表由构成逻辑表达式的其他任务(使用字母作为占位符)组成。示例如下:
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:
有一段时间一直在试图解决这个问题。任何帮助将不胜感激!
部分解决方案:
这有效,但仅适用于 "conservatively bracketed" 的表达式。换句话说,它可以解析[["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']
我有一份给定任务的先决条件列表。该列表由构成逻辑表达式的其他任务(使用字母作为占位符)组成。示例如下:
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:
有一段时间一直在试图解决这个问题。任何帮助将不胜感激!
部分解决方案:
这有效,但仅适用于 "conservatively bracketed" 的表达式。换句话说,它可以解析[["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']