使用Python将字符串标记为嵌套数组的列表

2024-06-26 19:36:48 发布

您现在位置:Python中文网/ 问答频道 /正文

this document之后,我正在为Brainfuck编写一个解释器,在我的实现中需要转换一个字符串,例如:

',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'

在这样的指令列表中:

^{pr2}$

或者,减去符号:

[ ... [...] ... [...] ... ]

现在我使用deque和popleft()递归地解决这个问题,每次迭代一个符号,但是我觉得应该一次将它分解成子数组。在

你如何用Python的方式解决这个问题?在

(出于速度原因排除了正则表达式)


Tags: 字符串列表方式指令符号数组thisdocument
3条回答

这不完全是一种“Python式的方式”,但是。。。。我用递归和生成器来解决这个问题

s = ',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'

def brainfuck2list(brainfuck):
  while brainfuck:               #if list is empty then finish
    e = brainfuck.pop(0)
    if e not in ("[","]"):
      yield e
    elif e == "[":
      yield list(brainfuck2list(brainfuck))
    else:
      break

[_ for _ in brainfuck2list(list(s))]

你得到以下输出

^{pr2}$

我快到了:

s=',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'

x = eval('["' + s.replace('[','",["').replace(']','"],"') + '"]')

这会产生:

^{pr2}$

这并不是您想要的,但是您也可以对字符串进行迭代。在

如果您担心eval的安全性,请使用^{}。在

更新:使用regex,我一路做到了:

import re
s=',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'
everything = re.compile("([^\]\[])")
y = eval('[' + everything.sub(r'"\1",',s).replace(",]","]").replace(']"','],"') + ']')

这将变成:

[',', '>', ',', '<', ['>', ['-', '>', '+', '>', '+', '<', '<'], '>', '>', ['-', '<', '<', '+', '>', '>'], '<', '<', '<', '-'], '>', '>', '.']

对于好奇的人来说,以下是我使用递归的有效解决方案:

def tokenize(code):
  instructions = deque()

  if len(code) > 0:
    while len(code) > 0:
      if code[0] is "[":
        code.popleft()

        group = deque()
        r = 0

        while r > -1 and len(code) > 0:
          if code[0] is '[':
            group.append(code.popleft())
            r += 1

          elif code[0] is ']':
            if r is 0: 
              code.popleft()

            else:
              group.append(code.popleft())

            r -= 1

          else:
            group.append(code.popleft())

        instructions.append(tokenize(group))

      else:
        instructions.append(code.popleft())

    return instructions

else:
  return instructions

相关问题 更多 >