簡體   English   中英

Python中字符串的列表列表

[英]A list of lists from string in Python

我需要一個方法,從下面的字符串生成一個列表:

"( * 1 2 ( - 4 3 ) )" -> ["*", 1, 2, ["-", 4, 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']]]

您需要添加一些代碼才能將字符串轉換為數字。

使用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']]]

沒有簡單的內置調用或可以使用的單線技巧,但它仍然完全可以管理。

首先,您需要標記輸入。 粗略地說,這意味着將它分成像(*123這樣的單位。如果你的輸入保證是空格分隔的,你可以使用split方法,但是如果你需要處理像(* (+ 1 2) 3)這樣的輸入(* (+ 1 2) 3) ,它可能有點難。

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

既然你有一系列令牌,我們就可以編寫一個遞歸解析器。 一次過一個令牌。

  • 如果您看到一個數字,請在其上調用intfloat並返回結果。
  • 如果您看到的不是數字或括號,請將其作為字符串返回。
  • 如果您看到一個左括號,則遞歸地解析令牌序列中的對象並將它們添加到列表中,直到您看到右括號。 返回列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM