我正在尝试将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,但我没理解它。
答案 0 :(得分: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]]]
答案 1 :(得分: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如何将它从一串数字转换为整数对象。接下来,它将表达式定义为括号内的表达式或整数列表。最后,为了解析您的示例,它会查找许多连续的表达式。