Python中字符串的列表列表

时间:2014-01-25 23:51:16

标签: python string list

我需要一个从字符串中生成列表的方法,如下所示:

"( * 1 2 ( - 4 3 ) )" -> ["*", 1, 2, ["-", 4, 3]] 

有没有简单的方法来处理这个问题?

3 个答案:

答案 0 :(得分:3)

有些事情是这样的:

a = " ( * 1 2 ( - 4 35 ) ( + 100 ( / 1 2 ) ) ( + 100 200 ) )"

def p(s):
    r = []
    for x in s:
        if x == "(":
            r.append( p(s) )
        elif x == ")":
            return r
        else:
            r.append(x)
    return r

p(iter(a.split()))

输出是:

缺货[23]:

[['*',
  '1',
  '2',
  ['-', '4', '35'],
  ['+', '100', ['/', '1', '2']],
  ['+', '100', '200']]]

您需要添加一些代码才能将字符串转换为数字。

答案 1 :(得分:3)

使用pyparsing,例如:

from pyparsing import *

enclosed = Forward()
nestedParens = nestedExpr('(', ')', content=enclosed) 
integer = Word( nums ) # simple unsigned integer
arithOp = Word( "+-*/", max=1 ) # arithmetic operators
enclosed << ( nestedParens | arithOp | integer )

data = '( * 1 2 ( - 4 3 ) )' 

print enclosed.parseString(data).asList()

输出:

$ python parse.py 
[['*', '1', '2', ['-', '4', '3']]]

答案 2 :(得分:2)

没有简单的内置调用或可以使用的单线技巧,但它仍然完全可以管理。

首先,您需要标记输入。粗略地说,这意味着将其分为(*123等单位。如果您的输入保证以空格分隔,则可以使用split方法,但如果您需要处理(* (+ 1 2) 3)之类的输入,则可能会有点困难。

>>> "( * 1 2 ( - 4 3 ) )".split()
['(', '*', '1', '2', '(', '-', '4', '3', ')', ')']

既然你有一系列令牌,我们就可以编写一个递归解析器。一次过一个令牌。

  • 如果您看到了某个号码,请在其上调用intfloat并返回结果。
  • 如果您看到的不是数字或括号,请将其作为字符串返回。
  • 如果您看到一个左括号,则递归地解析令牌序列中的对象并将它们添加到列表中,直到您看到右括号。退回清单。