2015-10-18 24 views
1

可以說我有一個簡單的列表,lis = [5, *, 2]Python的lambda表達式,使用字符串列表中的操作性

是否有可能沿着線做一些事情:我想用

print(reduce(lambda x,y,z: float(x) y float(z), lis)) 
10 

在列表中給出的字符串來確定操作數。

+1

您打算如何將列表中的'* *視爲有效語法? – Brian

+3

Aside:Pythonistas喜歡使用標識符'lst'來引用一個列表,而不是'list',因爲'list'會影響python內建。 – dg123

回答

2

運算符不能在Python中傳遞 - reduce(+, [1,2,3])會給你一個SyntaxError。同樣,您的運營商也在列表中。

如果您希望使用字符串查找運算符,則可以使用operator模塊構造字典。

SYMBOL_TO_OPERATOR = {"*": operator.mul, 
         "+": operator.add, ...} 

這些只是普通的方法雖然 - 你不能用「綴」的符號,你可以在符號中使用它們。

此外,這並沒有太大的意義,作爲reduce操作(也不會是非常習慣的python)。你可以很容易地做一些事情,如:

statements = [[1, "*", 5], [2, "+", 9]] 
results = [SYMBOL_TO_OPERATOR[symbol](a, b) for a, symbol, b in statements] 
3

首先,你不能放置*運營商的列表,因爲它不是在Python的值。相反,你可以使用mul函數從operator包:

from operator import mul 

然後,假設你有以下列表:

lst = [5, mul, 2] 

,你可以做到以下幾點:

a, op, b = lst 
print(op(a,b)) 

這應打印:

10 

2

讓我知道如果我是誤會,但我相信像下面將完成你的要求:

import operator 

operators = { 
    '*': operator.mul, 
    '/': operator.div 
} 

dynamic_operator = lambda x,y,z: operators[y](x, z) 

some_list = [5, '*', 5] 
print dynamic_operator(*some_list) 

您將需要擴大對operators字典來涵蓋所有要處理的操作動態。有關更多操作員功能,請參閱:https://docs.python.org/2/library/operator.html

+1

我正在嘗試此方法。 (* some_list)中的'*'是什麼意思? – JonCode

+1

您可以使用'*'將列表解壓縮爲參數。例如。做'somefunction(* [a,b])'就像做'somefunction(a,b)'一樣,並且可以在參數完全動態時使用。有關更多信息,請參閱:https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists – WilHall

+1

非常感謝! – JonCode