【问题标题】:Recursive/itterative function to return contents within brackets?递归/迭代函数返回括号内的内容?
【发布时间】:2015-06-07 18:47:54
【问题描述】:

我正在尝试创建一个函数,该函数查看多个括号并从内到外返回每组括号的内容。 所以给定输入 (9*(2*(6*6))),它会返回

(6*6)
(2*(6*6))
(9*(2*(6*6)))

到目前为止我有这个,但我不确定如何使它适用于多对括号。它只返回最里面的括号。

def in_brackets(str) :   
    close_b = 0
    open_b = 0

    if len(str) < 5 : 
        return True

    while str[close_b] != ')':
        close_b += 1
        if str[close_b] == '(':
            open_b = close_b    

    in_b = str[open_b:close_b + 1]

    return(in_b)

【问题讨论】:

  • 输入"((1+2)*(3+4))`应该返回什么?
  • 只会返回 (1+2)*(3+4)
  • 看看this answer(pyparsing)。

标签: python python-3.x recursion iteration


【解决方案1】:

你可以像这样使用pyparsing

>>> from pyparsing import nestedExpr
>>> nestedExpr('(',')').parseString('(9*(2*(6*6)))').asList()
[['9*', ['2*', ['6*6']]]]

或者,生成器的绝佳应用:

>>> def pcon(string):
...     stack = []
...     for i, c in enumerate(string):
...         if c == '(':
...             stack.append(i)
...         elif c == ')' and stack:
...             start = stack.pop()
...             yield string[start + 1: i]
... 
>>> for s in pcon('(9*(2*(6*6)))'):
...    print "({})".format(s)
... 
(6*6)
(2*(6*6))
(9*(2*(6*6)))

【讨论】:

    【解决方案2】:

    这将在线性时间内运行。

    class stacked(): # Nodes in the stack
        def __init__(self,obj,next):
            self.obj = obj
            self.next = next
        def getObj(self):
            return(self.obj)
        def getNext(self):
            return(self.next)
    
    class stack(): # The stack itself
        def __init__(self):
            self.top=None
        def push(self,obj):
            self.top = stacked(obj,self.top)
        def pop(self):
            if(self.top == None):
                return(None)
            r = self.top.getObj()
            self.top = self.top.getNext()
            return(r)
    
    def Framed(StringIn,l,r):
        s = stack()
        pairs=[]
        for n,k in enumerate(StringIn):
            if(k==l):
                s.push([n])
            if(k==r):
                q = s.pop()
                q.append(n+1)
                pairs.append(q)
        StringsOut = []
        for k in pairs:
            StringsOut.append(StringIn[k[0]:k[1]])
        return(StringsOut)
    s = "((1+2)*(3+4))"
    print(Framed(s,"(",")"))
    

    【讨论】:

      【解决方案3】:

      一个非常简单的递归函数:

      def parens(expr):
          if not expr:
              return
          parens(expr[expr.find('(', 1):expr.rfind(')', 0, len(expr)-1)+1])
          print(expr)
      
      >>> parens('(9*(2*(6*6)))')
      (6*6)
      (2*(6*6))
      (9*(2*(6*6)))
      >>> parens('((1+2)*(3+4))')
      (1+2)*(3+4)
      ((1+2)*(3+4))
      

      【讨论】:

        猜你喜欢
        • 2014-11-03
        • 2021-07-23
        • 1970-01-01
        • 2017-03-24
        • 2012-08-23
        • 2020-09-05
        • 2014-04-18
        • 2021-08-31
        • 2022-06-15
        相关资源
        最近更新 更多