从字符串序列创建Python lambda函数

时间:2018-06-23 17:11:42

标签: python string python-3.x function lambda

我有一个包含m个元素的列表以及出现在字符串列表中的n个不同的数字。列表遵循以下格式示例

eq = ['12', '2', '3', '-123', '-1', 'X']

请注意,X表示常量1,而不是变量1。我希望能够将其转换为lambda函数,该函数接受一个列表x并像该列表一样被加在一起。在我们的示例中,功能为

f(x) = x[1]*x[2] + x[2] + x[3] - x[1]*x[2]*x[3] - x[1] + 1

我知道如何使用常规功能执行此操作,但我想使其与lambda一起使用并碰壁。任何帮助,将不胜感激!

这是解决问题的函数:

def evaluateList(x, lst):
    num = 0
    for term in lst:
        if term[0] == "X":
            num += 1
        elif term[0] == "-":
            num -= reduce(lambda x,y: x*y, [x[int(y)-1] for y in term[1:]])
        else:
            num += reduce(lambda x,y: x*y, [x[int(y)-1] for y in term])
    return num

4 个答案:

答案 0 :(得分:3)

您可以两次使用<div id="top-bar"> <nav> <ul id="nav-buttons"> <li><a href="#">Menu</a></li> <li class="dropdown" style="background-color:#aaa;"> <a class="dropdown-title">Sub menu</a> <ul class="dropdown-sub"> <li class="dropdown-option">option 1</li> <li class="dropdown-option">option 2</li> <li class="dropdown-option">option 3</li> </ul> </li> <li><a href="#">Menu</a></li> <li><a href="#">Menu</a></li> <li><a href="#">Menu</a></li> <li><a href="#">Menu</a></li> </ul> </nav> </div>,尽管结果不是很干净:

functools.reduce

from functools import reduce
from operator import sub, add
eq = ['12', '2', '3', '-123', '-1', 'X']
_x = [6, 4, 1, 4, 5, 2, 4, 23, 2, 4]
final_result = reduce(lambda x, y:[add, sub][y.startswith('-')](
  reduce(lambda c, d:c*d, [_x[int(i)] for i in x]) if x in eq else x, 
  reduce(lambda c, d:c*d, [_x[int(i)] for i in (y[1:] if y.startswith('-') else y)] if y != 'X' else [1])
  ), eq)

输出:

print(final_result)
x = _x
print(x[1]*x[2] + x[2] + x[3] - x[1]*x[2]*x[3] - x[1] + 1)

但同样,预定义功能更易于阅读和缩放。

也略短一点,-10 -10

sum

答案 1 :(得分:3)

很明显,我推荐def实现:

from functools import reduce

eq = ['12', '2', '3', '-123', '-1', 'X']
x = [n for n in range(100)]

# Using an auxiliary function
def evaluate(n):
    if n == "X":
        return 1
    elif n[0] == "-":
        return reduce(lambda x, y: x * y, [x[int(y) - 1] for y in n[1:]])
    else:
        return reduce(lambda x, y: x * y, [x[int(y) - 1] for y in n])

print(sum(map(evaluate, eq)))

# As a pure lambda:

evaluate_lambda = lambda n: sum(map((lambda n: 1 if n == 'X' else (reduce(lambda x, y: x * y, [x[int(y) - 1] for y in n[1:]]) if n[0] == "-" else reduce(lambda x, y: x * y, [x[int(y) - 1] for y in n]))), eq))

print(evaluate_lambda(eq))

答案 2 :(得分:2)

这有点难看,但是可以用

Database.getInstance()

编辑:当然,这只是一个游戏。始终使用最易读的功能

答案 3 :(得分:2)

我认为这很简单:

from operator import mul
from functools import reduce
prod = lambda L: reduce(mul, L, 1)
evaluateList = lambda(x, eq): sum(
    1 if expr == 'X' 
    else prod(-1 if i == '-' 
              else x[int(i)] 
              for i in expr) 
    for expr in eq)