在 Python 开关盒等效项内执行数学运算
Perform math operations inside Python switch case equivalent
我正在尝试使用等效的 Switch case 来简化 Python 中的 if-elif-else 块。但是我在尝试在 switch case 字典中执行数学运算时遇到问题
我正在通过 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 函数,但这似乎导致了自我问题。变量。非常感谢任何指示或指导,示例示例
你所谓的"switch case equivalent"就是字典。字典是键值对的数据结构。字典不会以与 if...else 链相同的方式执行代码。您只能将值存储在字典中。这些值可能是函数,因为 python 中的函数是第一个 class 公民。但这并不真正适用于 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
我正在尝试使用等效的 Switch case 来简化 Python 中的 if-elif-else 块。但是我在尝试在 switch case 字典中执行数学运算时遇到问题
我正在通过 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 函数,但这似乎导致了自我问题。变量。非常感谢任何指示或指导,示例示例
你所谓的"switch case equivalent"就是字典。字典是键值对的数据结构。字典不会以与 if...else 链相同的方式执行代码。您只能将值存储在字典中。这些值可能是函数,因为 python 中的函数是第一个 class 公民。但这并不真正适用于 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