使用 eval 对列表求和

Summation of a list using eval

我有一个这样的列表

yy = ['A1', 'B1', 'C1']

在这样的字典中使用 A1B1C1 的值

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'。 在调试过程中,我发现如果我这样做 p = "sum([A1, B1, C1])" 和 eval 它会起作用。不确定为什么会这样?

完整代码:

ff = {
    'A1': 10,
    'B1': 20,
    'C1': 30
}


yy = ['A1', 'B1', 'C1']

p = "sum(lst)"

eval(p, {'lst': yy}, ff)

我知道eval的后果。我在到达 eval

之前过滤所有内容

你必须使用 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] 我们正在制作一个新列表,该列表包含 yyff

中(按键)引用的数字

我看到你的评论了:

I am using eval to parse Excel formulas like this one '=SUM(AY92:BI92)/SUM(AL92:AX92)' where I first expand the list from Ay92 to BI92 and then do a sum using eval

为什么不将 AY92:BI92 的值放入一个列表,将 AL92:AX92 的值放入第二个列表,然后它们使用 sum(lst1)/sum(lst2)? eval 是讨厌的,如果这个 excel 文件包含单元格内部的恶意代码,它将是 运行.

给定数据来总结列表中字符串引用的字典中的元素:

yy = ['A1', 'B1', 'C1']
ff = {
    'A1': 10,
    'B1': 20,
    'C1': 30
}
print (sum(map(ff.get, yy)))

ff.get returns 给定键的值。将其映射到列表中,给出一个数字列表,然后将其提供给 sum.

参见:

>>> print (sum(map(ff.get, yy)))
60

如果你必须eval:

>>> eval("sum(map(tab.get, lst))", {'lst': yy, 'tab': ff})
60

非常简单:

>>> yy = ['A1', 'B1', 'C1']
>>> ff = {
...     'A1': 10,
...     'B1': 20,
...     'C1': 30
... }
>>> sum(ff[i] for i in yy)
60

但是,如果您以某种方式需要使用 eval(我不知道为什么)。

>>> eval("+".join(yy), ff)
60

但是,真的没有理由为此使用 eval。它既不快速也不安全。

虽然不建议您可以尝试

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("'", '')

这将从您之前的变量中 return '[A1, B1, C1]'