我正在尝试从该元组(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:]
时循环播放,依此类推,但是我无法获取它。任何帮助是极大的赞赏。谢谢!
答案 0 :(得分:1)
由于您未提供任何代码,因此我将为您提供一些想法,而无需任何最终代码。如果您想要更多细节,请自己做更多的工作。
似乎您需要比较连续元组的值。在第一个元组之前或最后一个元组之后,您也没有什么要比较的,但是如果您添加表示空项目和深度为0的元组,则可以进行所有比较。
因此,在您的循环中,请使用zip
获得两个连续的元组,并且它们之间的列表彼此不相同。您可以在开头和结尾添加保护元组以显示深度零,并且如果它们的值为空字符串,则这些值将不会显示在结果中。
所以您可以循环播放
for tuple1, tuple2 in zip([('', 0)] + lst, lst + [('', 0)]:
第一次通过循环,tuple1
将成为保护元组('', 0)
,而tuple2
将成为列表中的第一个元组。循环中的最后一次,tuple1
将成为列表中的最后一个元组,而tuple2
将成为保护元组('', 0)
。每隔一次,tuple1
是列表中的一个元组,而tuple2
是列表中的下一个元组。
然后在比较元组时,根据深度之间的差异添加左括号或右括号。这些零深度启用了开始和结束括号。在圆括号后,将该项目添加到第二个(后来的)元组中。如果需要and
和or
,可以在此处添加空格。
你能从这里结束吗?
答案 1 :(得分:1)
如果您不关心and
和or
周围的空格,则此代码应该有效
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
我认为这是对您问题的正确理解,因为它适用于您的示例(减去空格)。