0

我正在尝试使用等效的 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 函数,但这似乎会导致 self 出现问题。变量。非常感谢任何指针或指导,示例示例

4

2 回答 2

2

如果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
于 2018-09-13T20:16:20.973 回答
0

你所说的“switch case 等价物”被称为字典。字典是键值对的数据结构。字典不会以与 if...else 链相同的方式执行代码。您只能将值存储在字典中。这些值可能是函数,因为 python 中的函数是一等公民。但这并不适合python中的简单解决方案。原始的 if...else 链是完全可以接受的。

于 2018-09-13T20:12:20.337 回答