Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python开关大小写等效内执行数学运算_Python_Dataframe_Switch Statement_First Class Functions - Fatal编程技术网

在Python开关大小写等效内执行数学运算

在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

我试图用一个等价的开关大小写来简化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   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基本上是字典中所有键的列表