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