【问题标题】:Logical expression building out of a list of tuples从元组列表构建逻辑表达式
【发布时间】:2018-08-15 22:01:39
【问题描述】:

我正在尝试从元组 (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:] 等等,但我无法得到它。任何帮助是极大的赞赏。谢谢!

【问题讨论】:

  • orand 周围的空格是否必要?它们不是您的数据或描述的一部分。

标签: python loops enumerate


【解决方案1】:

由于您没有提供任何代码,我将只给您一些想法,而无需任何最终代码。如果您想了解更多细节,请展示更多您自己的作品。

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

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

这样你就可以循环了

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

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

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

你能从这里结束吗?

【讨论】:

  • 嗨,Rory,是的,这些空格只是为了便于阅读。我真的很喜欢这种方法——我将努力发布一个跟随它的 sn-p。谢谢!
【解决方案2】:

如果您不关心 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

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

【讨论】:

  • 代码基本上只是您描述的翻译,但如果进一步的 cmets 有用,请告诉我。
  • 非常有启发性且易于理解——拆分原始列表并将其用作初始深度的想法不知何故让我无法理解。非常感谢!
  • @RoryDaulton 您的评论让我再次查看代码并尝试使其更简洁,因此我用更简洁的代码更新了我的帖子(我希望如此)。当我最初编写代码时,我注意到了重复性,但我想不出一个很好的方法来避免它。我对包含开放括号的方式所做的新更改很好,但对于关闭括号(for 循环中的+ [('', 0)]),我仍然希望让它变得更好。
  • 该更新确实改进了您的代码——它现在符合 DRY(不要重复自己)原则。它仍然比我的方法简单。除了切换到我的方法(在某些方面更好但在其他方面更糟)之外,除了添加 cmets 之外,我看不到如何改进您的代码。你确实使用了我的一个想法,即保护元组,但这没关系。
  • @RoryDaulton 我明白你在我之前的帖子中对保护元组的意思,但我没看到,抱歉。感谢您的同意!
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多