Я пытаюсь упростить блок if-elif-else в Python с эквивалентом корпуса Switch. Но у меня возникают проблемы с выполнением математических операций внутри словаря case 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, но, похоже, это вызывает проблемы с самим собой. переменные. Любые указатели или рекомендации, примеры примеров очень приветствуются.






То, что вы называете «эквивалентом переключателя», называется словарем. Словарь - это структура данных для пар ключ-значение. Словарь не выполняет код таким же образом, как цепочка 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.map_ext[self.newdataframe.iloc[i]['FT'] if self.newdataframe.iloc[i]['FT'] in self.ftypes else 'other'] += edisself.ftypes - это в основном список всех ключей в этом словаре.