3

我正在尝试将 lisp 输入解析为 python 列表。但是当我解析输入时,我得到了字符串列表,但我希望单个元素为 int。

示例:当我解析以下输入时:"(2 (10 (5 11))) (5 6) (4)" 输出:[[['2'], ['10', '5']], [['5'], ['6']], [['4']]]

我使用:[[map(int, x) for x in lst] for lst in test]将字符串转换为,int但是这个函数只会解析2级的嵌套列表。但是如果我有一个超过2个的嵌套列表,我应该如何使用它来解析?

我尝试了 pyparsing,但我没有正确理解它。

4

2 回答 2

5
def as_int(xs):
    if isinstance(xs, list):
        return map(as_int, xs)
    elif isinstance(xs, str):
        return int(xs)
    return xs

用法:

>>> xs = [[['2'], ['10', '5']], [['5'], ['6']], [['4']]]
>>> print as_int(xs)
[[[2], [10, 5]], [[5], [6]], [[4]]]
于 2013-09-23T07:07:59.770 回答
3

如果你想使用 pyparsing,你可以在没有任何后处理的情况下这样做,如下所示。

import pyparsing as pp

integer = pp.Word(pp.nums).setParseAction(lambda m:int(m[0]))
expr = pp.Forward()
expr << pp.nestedExpr(content=pp.OneOrMore(integer | expr))
manyExpr = pp.OneOrMore(expr)

print manyExpr.parseString('(2 (10 (5 11))) (5 6) (4)')
    #returns [[2, [10, [5, 11]]], [5, 6], [4]]

这首先将整数定义为仅由数字组成的东西,并告诉 pyparsing 如何将其从数字字符串转换为整数对象。接下来,它将表达式定义为括号内的表达式或整数列表。最后,为了解析您的示例,它会查找许多连续的表达式。

于 2013-09-23T21:35:27.310 回答