我有一个像这样的列表
[HttpPost]
public ActionResult Index(BookingViewModel vm)
// the `ViewModels` -> Booking -> Departure prop will be pupulated with the value from the selection in the dropdown
{
return View(vm);
}
在这样的字典中使用yy = ['A1', 'B1', 'C1']
,A1
和B1
的值
C1
现在我想用ff = {
'A1': 10,
'B1': 20,
'C1': 30
}
中的值来对列表求和。这就是我试图做的事情
ff
但我得p = "sum(lst)"
eval(p, {'lst': yy}, ff)
。
在调试过程中,我发现如果我喜欢这个TypeError: unsupported operand type(s) for +: 'int' and 'str'
并且eval它可以工作。不知道为什么会这样?
完整代码:
p = "sum([A1, B1, C1])"
我知道ff = {
'A1': 10,
'B1': 20,
'C1': 30
}
yy = ['A1', 'B1', 'C1']
p = "sum(lst)"
eval(p, {'lst': yy}, ff)
的后果。我在到达eval
答案 0 :(得分:3)
您必须使用eval吗?
为什么不使用sum()
;
yy = ['A1', 'B1', 'C1']
ff = {
'A1': 10,
'B1': 20,
'C1': 30
}
print sum([ff[key] for key in yy])
如果您确实需要使用eval
,请按以下步骤操作:
print eval('+'.join(str(ff[key]) for key in yy))
# or for short
print eval("+".join(yy), globals=ff)
# or the way you are doing
print eval("sum(lst)", {'lst': [ff[key] for key in yy]})
您获得TypeError
的原因是"sum(lst)"
表示sum(['A1', 'B1', 'C1'])
,而Python不知道如何处理。通过将lst
更改为[ff[key] for key in yy]
,我们会在yy
ff
制作一个新的列表(按键引用)
我看到你的评论:
我正在使用eval来解析Excel公式,例如'= SUM(AY92:BI92)/ SUM(AL92:AX92)',其中我首先将列表从Ay92扩展到BI92,然后使用eval进行求和
为什么不将AY92:BI92
的值放入列表,将AL92:AX92
的值放入第二个列表,然后使用sum(lst1)/sum(lst2)
? Eval很讨厌,如果这个excel文件包含单元格中的恶意代码,它将被运行。
答案 1 :(得分:1)
虽然不建议您尝试
ff = {
'A1': 10,
'B1': 20,
'C1': 30
}
yy = '[A1, B1, C1]'
p = "sum(eval(lst))"
eval(p, {'lst': yy}, ff)
这是
的工作第一个eval
调用将转换变量lst
并执行
sum(eval('[A1, B1, C1]'))
第二个eval
现在将转换内部变量并将其设为
sum([10, 20, 30])
这将为您提供输出。
另请注意,如果您无法初始化变量yy
,则可以使用str.replace
函数
yy = str(yy).replace("'", '')
这将从您之前的变量返回'[A1, B1, C1]'
。
答案 2 :(得分:0)
给定数据来汇总字典中由列表中的字符串引用的元素:
yy = ['A1', 'B1', 'C1']
ff = {
'A1': 10,
'B1': 20,
'C1': 30
}
print (sum(map(ff.get, yy)))
ff.get
返回给定键的值。在列表中映射,给出一个数字列表,然后将其提供给sum
。
请参阅:
>>> print (sum(map(ff.get, yy)))
60
如果您必须eval
:
>>> eval("sum(map(tab.get, lst))", {'lst': yy, 'tab': ff})
60
答案 3 :(得分:0)
这很简单:
pic img
但是,如果你以某种方式需要使用eval(我不知道为什么)。
>>> yy = ['A1', 'B1', 'C1']
>>> ff = {
... 'A1': 10,
... 'B1': 20,
... 'C1': 30
... }
>>> sum(ff[i] for i in yy)
60
但是,实际上没有理由使用>>> eval("+".join(yy), ff)
60
。既不快也不安全。