在Python开关大小写等效内执行数学运算
我试图用一个等价的开关大小写来简化Python中的if-elif-else块。但是我在尝试在switch case字典中执行数学运算时遇到了问题 我在一个FOR循环中执行这段代码,该循环在一个pandas数据帧中运行。基本上是根据一个条件做一些数学 示例数据帧:在Python开关大小写等效内执行数学运算,python,dataframe,switch-statement,first-class-functions,Python,Dataframe,Switch Statement,First Class Functions,我试图用一个等价的开关大小写来简化Python中的if-elif-else块。但是我在尝试在switch case字典中执行数学运算时遇到了问题 我在一个FOR循环中执行这段代码,该循环在一个pandas数据帧中运行。基本上是根据一个条件做一些数学 示例数据帧: 10889 103.579 89.160 2.98 2.1154 NaN in 0.48 0.20 15.0 10890 103.859 89.133 2.98 2.1266 NaN
10889 103.579 89.160 2.98 2.1154 NaN in 0.48 0.20 15.0
10890 103.859 89.133 2.98 2.1266 NaN out 0.48 0.20 15.0
10891 104.067 89.133 2.98 2.1349 NaN out 0.48 0.20 15.0
10892 106.867 91.933 2.98 2.293 NaN out 0.48 0.20 15.0
10893 106.867 91.859 2.98 2.2959 NaN sol 0.48 0.20 15.0
10894 106.840 91.579 2.98 2.3072 NaN sol 0.48 0.20 15.0
10895 106.785 91.302 2.98 2.3184 NaN sol 0.48 0.20 15.0
10896 106.728 91.115 2.98 2.3263 NaN text 0.48 0.20 15.0
10897 104.885 89.272 2.98 2.4303 NaN text 0.48 0.20 15.0
10898 104.885 89.272 2.98 0 NaN mid 0.48 0.20 15.0
当前代码:
if self.newdataframe.iloc[i]['FT'] in ('in', 'out'):
self.ext_out += edis
elif self.newdataframe.iloc[i]['FT'] == 'sol':
self.ext_sol += edis
elif self.newdataframe.iloc[i]['FT'] == 'mid':
self.ext_mid += edis
elif self.newdataframe.iloc[i]['FT'] == 'text':
self.ext_text += edis
else:
self.ext_other += edis
将其转换为开关箱。。这是我的尝试。代码看起来像这样,但它显然抛出了错误
newdict = { 'in': self.ext_out += edis,
'out': self.ext_out += edis,
'sol': self.ext_sol += edis,
'mid': self.ext_mid += edis,
'text': self.ext_text += edis}
newdict[self.newdataframe.iloc[i]['FT']]
我尝试使用Lambda函数,但这似乎会导致self出现问题。变量。任何指针或指南、示例都非常受欢迎您称之为“切换案例等价物”的内容称为字典。字典是键值对的数据结构。字典不会以与if…else链相同的方式执行代码。只能在字典中存储值。这些值可能是函数,因为python中的函数是一流的公民。但这实际上并不适用于python中的简单解决方案。原始的if…else链完全可以接受 你所谓的“开关大小写等价物”被称为字典。字典是键值对的数据结构。字典不会以与if…else链相同的方式执行代码。只能在字典中存储值。这些值可能是函数,因为python中的函数是一流的公民。但这实际上并不适用于python中的简单解决方案。原始的if…else链完全可以接受 如果
self.ext
是一个包含键out
、sol
等的字典,而不是每个键单独的属性,可能会更好。按原样,您可以将setattr
与适当的dict
一起使用
d = {x: x for x in ['out', 'mid', 'sol', 'text']}
d['in'] = 'out'
x = 'ext_' + d.get(self.newdataframe.iloc[i]['FT'], 'other')
setattr(self, x, getattr(self, x) + edis)
更好的方法是:
self.ext[d.get(self.newdataframe.iloc[i]['FT'], 'other')] += edis
如果
self.ext
是一个带有键out
、sol
等的字典,而不是每个键单独的属性,可能会更好。按原样,您可以将setattr
与适当的dict
一起使用
d = {x: x for x in ['out', 'mid', 'sol', 'text']}
d['in'] = 'out'
x = 'ext_' + d.get(self.newdataframe.iloc[i]['FT'], 'other')
setattr(self, x, getattr(self, x) + edis)
更好的方法是:
self.ext[d.get(self.newdataframe.iloc[i]['FT'], 'other')] += edis
“更好的方法”非常有效。非常感谢。虽然我对它做了一点小小的改变,但是我快速理解了self.map_ext[self.newdataframe.iloc[I]['FT']如果self.newdataframe.iloc[I]['FT']在self.ftypes中,其他的'other']+=edisself.ftypes基本上是字典中所有键的列表“更好的方法”运行得很好。非常感谢。虽然我对它做了一点小小的改变,但是我快速理解了self.map_ext[self.newdataframe.iloc[I]['FT']if self.newdataframe.iloc[I]['FT']in self.ftypes else'other']+=edisself.ftypes基本上是字典中所有键的列表