簡體   English   中英

您如何在python中解析列表以合並整數,同時不考慮方程式的運算符

[英]How would you parse a list in python to combine integer while leaving the operator of an equation alone

您如何在python中解析列表以合並整數,同時不考慮方程式運算符?

list =['(' ,'1', '+', '2', ')', '+', '(', '2', '0'. '0', '/', '2', '5', ')']

我希望最終能夠使用這樣的列表來創建一個從用戶輸入中得出的可計算公式。 可能嗎?

如果對象要進行計算,請完全跳過轉換為整數並執行eval 假設您從輸入'(1+2)+(200/25)'獲得了此字符串,則可以執行以下操作:

calc_result = eval(calc_input) # equals 11

但是請注意,使用eval可以運行提供給它的任何python代碼,因此,如果它是供公眾使用的程序,則有人會想出一種使用此部分的方式來插入您從未打算允許的代碼。

通常應避免evalexec因為它們可能會帶來安全風險。 有關詳細信息,請參閱由資深專家Ned Batchelder 評估Eval確實很危險 (感謝@ PM2Ring的評論)

如果您不介意使用sympy

from sympy import sympify

lst = ['(', '1', '+', '2', ')', '+', '(', '2', '0', '0', '/', '2', '5', ')']

res = sympify(''.join(lst))
print(res)  # 11

(不知道只留下方程式的運算符是什么意思。您的表達式不是方程式...)。

為了正確執行此類操作,您將需要一個解析器。 可以創建自己的:解析算法有據可查。 但是,您不需要從頭開始構建解析器,可以使用pyparsing之類的包來創建解析器。

如果可以保證用戶輸入是完全安全的,則可以讓Python通過內置的eval函數為您評估它。 但是, eval速度很慢,並且是一個安全漏洞,因為它可以用來執行任意代碼,正如Ned Batchelder在文章中提到的那樣,該文章鏈接到了Ofer Sadan的答案。

但是,要回答您的緊迫問題,我們可以輕松地從字符串列表中獲取數字,將它們連接在一起,然后將結果數字字符串轉換為整數。 使用itertools.groupby可以輕松地對數字進行分組並將其與非數字分開。 您只需要賦予它可以用來識別組的功能即可; 我們可以使用str.isdigit 這是一個簡短的演示:

from itertools import groupby

lst = ['(' ,'1', '+', '2', ')', '+', '(', '2', '0', '0', '/', '2', '5', ')']
a = [int(''.join(g)) if k else next(g) for k, g in groupby(lst, str.isdigit)]
print(a)

產量

['(', 1, '+', 2, ')', 200, '/', 25, ')']

如果您還想處理+-符號和小數點,那么編寫執行該操作的函數並不難。 正確處理所有浮點數會有些棘手,最好使用已經知道該怎么做的解析器。 ;)

暫無
暫無

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

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