Python 使用eval对列表求和

Python 使用eval对列表求和,python,list,eval,Python,List,Eval,我有一张这样的清单 yy = ['A1', 'B1', 'C1'] 在这样的dict中使用A1、B1和C1的值 ff = { 'A1': 10, 'B1': 20, 'C1': 30 } 现在我想用ff中的值对列表求和。这就是我试图做的 p = "sum(lst)" eval(p, {'lst': yy}, ff) 但是我得到了TypeError:+:'int'和'str'不支持的操作数类型。 在调试过程中,我发现如果我喜欢这个p=“sum([A1,B1,C1])

我有一张这样的清单

yy = ['A1', 'B1', 'C1']
在这样的dict中使用
A1
B1
C1
的值

ff = {
    'A1': 10,
    'B1': 20,
    'C1': 30
}
现在我想用
ff
中的值对列表求和。这就是我试图做的

p = "sum(lst)"

eval(p, {'lst': yy}, ff)
但是我得到了
TypeError:+:'int'和'str'不支持的操作数类型
。 在调试过程中,我发现如果我喜欢这个
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

之前过滤所有内容,您必须使用吗

为什么不使用
sum()

如果您确实需要使用
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]})
得到
类型错误的原因是
的“sum(lst)”
本质上是
sum(['A1','B1','C1'])
,Python不知道如何处理它。通过将
lst
更改为
[ff[key]表示yy中的key]
我们正在制作一个新的列表,其中包含
yy
ff
中引用的编号(按key)

我看到你的评论:

我使用eval解析Excel公式,比如“=SUM(AY92:BI92)/SUM(AL92:AX92)”,首先将列表从AY92展开到BI92,然后使用eval进行求和

为什么不将
AY92:BI92
的值放入一个列表,将
AL92:AX92
的值放入第二个列表,然后使用
sum(lst1)/sum(lst2)
?Eval很糟糕,如果此excel文件在单元格中包含恶意代码,它将运行。

您必须使用吗

为什么不使用
sum()

如果您确实需要使用
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]})
得到
类型错误的原因是
的“sum(lst)”
本质上是
sum(['A1','B1','C1'])
,Python不知道如何处理它。通过将
lst
更改为
[ff[key]表示yy中的key]
我们正在制作一个新的列表,其中包含
yy
ff
中引用的编号(按key)

我看到你的评论:

我使用eval解析Excel公式,比如“=SUM(AY92:BI92)/SUM(AL92:AX92)”,首先将列表从AY92展开到BI92,然后使用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
返回给定键的值。将其映射到列表中,给出一个数字列表,然后将该列表指定给
sum

见:

如果必须
eval

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

给定要汇总字典中由列表中的字符串引用的元素的数据:

yy = ['A1', 'B1', 'C1']
ff = {
    'A1': 10,
    'B1': 20,
    'C1': 30
}
print (sum(map(ff.get, yy)))
ff.get
返回给定键的值。将其映射到列表中,给出一个数字列表,然后将该列表指定给
sum

见:

如果必须
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
。它既不快也不安全

这是非常严格的:

>>> yy = ['A1', 'B1', 'C1']
>>> ff = {
...     'A1': 10,
...     'B1': 20,
...     'C1': 30
... }
>>> sum(ff[i] for i in yy)
60
但是,如果您需要使用eval(我不知道为什么)


但是,确实没有理由为此使用
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
,则可以使用该函数


这将从先前的变量中返回
'[A1,B1,C1]

虽然不建议这样做,但您可以尝试

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
,则可以使用该函数



这将从先前的变量中返回
'[A1,B1,C1]

我需要用eval()来做这件事,我需要用eval()来做这件事,我需要用eval()来做这件事,我想在这里扩展f.rodrigues的答案。当您像OP那样执行
eval(p,{'lst':yy},ff)
时,它执行
sum(lst)
这是
sum(['A1','B1','C1'])
它返回
类型错误
如何删除A1中的括号,等等?那就可以了。它会抛出一个
NameError
,因为你还没有定义
A1
是什么。我需要使用eval()来实现这一点,我想在这里扩展f.rodrigues的答案。当您像OP那样执行
eval(p,{'lst':yy},ff)
时,它执行
sum(lst)
这是
sum(['A1','B1','C1'])
它返回
类型错误
如何删除A1中的括号,等等?那就可以了。它会抛出一个
NameError
,因为你还没有定义
A1
是什么。解释一下你为什么需要eval。你需要一个很好的理由来使用eval。简单地说:不要使用eval。我正在使用eval解析Excel公式,如下面的
'=SUM(AY92:BI92)/SUM(AL92:AX92)
,其中我首先将列表从AY92展开到BI92,然后使用eval进行求和。我确实理解您的问题。您是否试图干预
eval
的可选参数以获取输出?在看起来像(用户生成的?)输入的东西上使用eval是错误的。s