使用eval汇总列表

时间:2015-08-29 17:36:59

标签: python list eval

我有一个像这样的列表

[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'] A1B1的值

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

之前过滤了所有内容

4 个答案:

答案 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扩展到BI​​92,然后使用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 。既不快也不安全。