此问题在此处已有答案:
Add Variables to Tuple(8个答案)
三个月前关门了。
我使用scipy.optimize.minimize进行约束。文档中的示例(位于http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.minimize.html)使用约束:
cons = ({'type': 'ineq', 'fun': lambda x: x[0] - 2 * x[1] + 2},
{'type': 'ineq', 'fun': lambda x: -x[0] - 2 * x[1] + 6},
{'type': 'ineq', 'fun': lambda x: -x[0] + 2 * x[1] + 2})
我想做类似的事情,但是在一个循环中生成这个序列的元素,但是我遇到了麻烦。
我试着把cons当作一个元组,一个与上面形式相同的例子:
cons = (,)
for i in range(4):
cons += ({'type': 'ineq', 'fun': lambda x: x[0] - 2 * x[1] + i})
但我得到的是TypeError: unsupported operand type(s) for +=: 'dict' and 'dict'
。
我还尝试使用str
和eval
:
cons = (str({'type': 'ineq', 'fun': lambda x: x[0] - 2 * x[1]}))
for i in range(3):
cons += (str({'type': 'ineq', 'fun': lambda x: x[0] - 2 * x[1] + i + 1}))
cons = eval(cons)
但那也不起作用,我得到的结果是
cons = eval(cons)
File "<string>", line 1
{'fun': <function <lambda> at 0x062964F0>, 'type': 'eq'}{'fun': <function <lambda> at 0x062964F0>, 'type': 'eq'}{'fun': <function <lambda> at 0x062964F0>, 'type': 'eq'}{'fun': <function <lambda> at 0x062964F0>, 'type': 'eq'}
^
SyntaxError: invalid syntax
3条答案
按热度按时间l3zydbqr1#
元组是不可变的。
一旦创建了元组,就不能修改元组中的元素数量或它们的顺序。
"你可以这样做"
这将给予你一个字典列表。一旦你的列表完成了,如果你想把它变成一个元组,你可以做:
结果是:
--
通常,列表用于循环;结构的元组。列表是同构的; Tuple异质。长度可变的清单。
因此,在您的情况下,您可能希望保留该列表,除非某个第三方模块需要元组。
55ooxyrt2#
而不是添加一个dict(括号在这里没有任何作用):
添加一个元组,在dict后面添加一个逗号:
--
请注意,正如@Jivan在其答案中所指出的,您应该使用列表来完成这类工作。
rsl1atfo3#
这是一个比较老的问题,但两种解决方案似乎都是错误的,还是我遗漏了什么?
印刷品:
问题是每个lambda的闭包都指向对象i,而不是指向对象i在特定循环迭代中的值。更多细节请参见:Python lambda closure scoping