显式创建字典列表,而不是通过针对lambda表达式的循环迭代创建字典列表

时间:2018-12-25 00:38:31

标签: python list dictionary

考虑黑盒函数f,该函数输入x并返回实数a。

def foo(x): ... return a

我们知道f是x的确定函数。 假设

x = []
for i in range(2):
    x.append({'type': 'eq', 'fun': lambda x: x[i] + x[3+i] - 1000})

y = [{'type': 'eq', 'fun': lambda x: x[0] + x[3+0] - 1000},
       {'type': 'eq', 'fun': lambda x: x[1] + x[3+1] - 1000}
       ]

我得到了foo(x) != foo(y),这意味着x与y不同。

xy怎么可能不同? xy有什么区别?

这是一个可验证且完整的示例:

import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds

X0 = [0,0,0,0]

x = []
for i in range(2):
    x.append({'type': 'eq', 'fun': lambda x: x[i] + x[2+i] - 1000})

y = [{'type': 'eq', 'fun': lambda x: x[0] + x[2] - 1000},
       {'type': 'eq', 'fun': lambda x: x[1] + x[3] - 1000}
       ]

def f(a):
    return a[0] + a[1] + a[2] + a[3]


print(minimize(f, X0, constraints=x,
               bounds = bounds, options={'disp': False} ).x)
print(minimize(f, X0, constraints=y,
               bounds = bounds, options={'disp': False} ).x)

此打印:

[724.07734394 500. 0. 500.]

[500。 500. 500. 500。]

实际上,y给出正确的结果。为什么x给出错误的结果?

回答我自己的问题:

执行以下操作:

import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds

X0 = [0,0,0,0]

x = []
for i in range(2):
    x.append({'type': 'eq', 'fun': lambda a, i=i: a[i] + a[split+i] - 1000})

y = [{'type': 'eq', 'fun': lambda x: x[0] + x[2] - 1000},
       {'type': 'eq', 'fun': lambda x: x[1] + x[3] - 1000}
       ]

def f(a):
    return a[0] + a[1] + a[2] + a[3]


print(minimize(f, X0, constraints=x,
               bounds = bounds, options={'disp': False} ).x)
print(minimize(f, X0, constraints=y,
               bounds = bounds, options={'disp': False} ).x)

0 个答案:

没有答案