使用 eval 对列表求和
Summation of a list using eval
我有一个这样的列表
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'
。
在调试过程中,我发现如果我这样做 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]
我们正在制作一个新列表,该列表包含 yy
在 ff
中(按键)引用的数字
我看到你的评论了:
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]'
。
我有一个这样的列表
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'
。
在调试过程中,我发现如果我这样做 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]
我们正在制作一个新列表,该列表包含 yy
在 ff
我看到你的评论了:
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]'
。