我试图用Python等效的Python简化Python中的if-elif-else块。但我在切换案例字典中尝试执行数学运算时遇到问题
我在通过pandas数据帧运行的FOR循环中执行此代码。基本上根据条件做一些数学。
示例数据帧:
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.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
你称之为“等效的switch case”被称为字典。字典是键值对的数据结构。字典不会以与if ... else链相同的方式执行代码。您只能在字典中存储值。这些值可能是函数,因为python中的函数是一等公民。但这并不适合在python中使用简单的解决方案。最初的if ... else链是完全可以接受的。