我有一个包含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
答案 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)