从元组列表中构建逻辑表达式

时间:2018-08-15 22:01:40

标签: python loops enumerate

我正在尝试从该元组(a,b)列表中构建一个逻辑表达式,其中a是运算符,b是深度。基本上,如果下一个元组中的第二个元素大于上一个元素,则插入'(',如果小于,则插入')'-如果相等,则跳过。

以下是我正在谈论的示例:

lst = [('a', 8), ('or', 7), ('b', 8), ('and', 6), ('c', 7), ('and', 5), ('d', 7), ('and', 6), ('e', 7)]

期望的输出为:

((((((((a) or ( b)) and ( c)) and ((d) and (e)))))))

我尝试了枚举,在添加第二个列表lst[1:]时循环播放,依此类推,但是我无法获取它。任何帮助是极大的赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

由于您未提供任何代码,因此我将为您提供一些想法,而无需任何最终代码。如果您想要更多细节,请自己做更多的工作。

似乎您需要比较连续元组的值。在第一个元组之前或最后一个元组之后,您也没有什么要比较的,但是如果您添加表示空项目和深度为0的元组,则可以进行所有比较。

因此,在您的循环中,请使用zip获得两个连续的元组,并且它们之间的列表彼此不相同。您可以在开头和结尾添加保护元组以显示深度零,并且如果它们的值为空字符串,则这些值将不会显示在结果中。

所以您可以循环播放

for tuple1, tuple2 in zip([('', 0)] + lst, lst + [('', 0)]:

第一次通过循环,tuple1将成为保护元组('', 0),而tuple2将成为列表中的第一个元组。循环中的最后一次,tuple1将成为列表中的最后一个元组,而tuple2将成为保护元组('', 0)。每隔一次,tuple1是列表中的一个元组,而tuple2是列表中的下一个元组。

然后在比较元组时,根据深度之间的差异添加左括号或右括号。这些零深度启用了开始和结束括号。在圆括号后,将该项目添加到第二个(后来的)元组中。如果需要andor,可以在此处添加空格。

你能从这里结束吗?

答案 1 :(得分:1)

如果您不关心andor周围的空格,则此代码应该有效

def fun(lst):
    text = ''
    last = 0
    for op, depth in lst + [('', 0)]:
        if depth > last:
            text += '(' * (depth - last)
        elif depth < last:
            text += ')' * (last - depth)
        text += op
        last = depth
    return text

我认为这是对您问题的正确理解,因为它适用于您的示例(减去空格)。