在最简单的方法上需要指导。我有多个资产,每个资产都有多个数据点。我希望根据对每个数据点的决策为每个资产分配一个值。例如,每一项资产都是一所房子,而数据点包括窗户、车库门、破篱笆等,每个房子都有一个分数。
除了数以百计的if语句和加/减分数之外,还有推荐的编码方法吗?
我打算怎么做的例子
def score_house(house):
# score house
score = 0
if (house.windows > 2): score += 10
if (house.garage): score += 10
if (house.fence == 'broken'): score += 80
return score发布于 2019-04-22 06:55:26
我认为您也可以在这里使用“责任链”模式:
该模式允许多个对象处理请求,而无需将发送方类耦合到接收方的具体类。该链可以在运行时与遵循标准处理程序接口的任何处理程序动态组合。
使用这种模式的好处是,您可以在不同的模块中定义和扩展不同的评分器,并根据问题条件在运行时动态地组合它们。这是你怎么做的。首先,定义父记分员类:
from functools import reduce
class BaseScorer(object):
def __init__(self):
self._next_scorer = None
def set_next(self, scorer):
self._next_scorer = scorer
return scorer
def _call_next(self, house, score):
if self._next_scorer is None:
return score
return self._next_scorer.score(house, score)
def score(self, house, score=0):
raise NotImplementedError
@staticmethod
def chain(scorers):
reduce(lambda x, y: x.set_next(y), scorers)
return scorers[0]然后,定义各种记分员类,例如:
class WindowScorer(BaseScorer):
def score(self, house, score=0):
if house.windows > 2:
score = score + 10
return self._call_next(house, score)
class GarageScorer(BaseScorer):
def score(self, house, score=0):
if house.garage:
score = score + 10
return self._call_next(house, score)
class FenceScorer(BaseScorer):
def score(self, house, score=0):
if house.fence == 'broken':
score = score - 5
return self._call_next(house, score)这就是如何使用它:
scorer = BaseScorer.chain([
WindowScorer(),
GarageScorer(),
FenceScorer()
])
house = House(windows=4, garage=True, fence='nice')
score = scorer.score(house)发布于 2019-04-22 03:11:50
我认为你的方法很好,不值得去尝试做其他的事情。您可能希望通过定义如下函数来更多地组织它:
def add_score(x, score):
score += x
return score像这样的dictionary:
sdict = {windows: 10, garage: 10, broken_fence: 10}这样您就可以像这样调用您的函数:
def score_house(house):
# score house
score = 0
if (house.windows > 2): add_score(sdict[windows])
if (house.garage): add_score(sdict[garage])
if (house.fence == 'broken'): add_score(sdict[broken_fence])
return score并且可以很容易地改变一个dictionary的得分。
您还可以使用Enums (现在仔细考虑了,也许应该)
from enum import Enum
class Scoring(Enum):
WINDOWS = 10
...
def score_house(house):
# score house
score = 0
if (house.windows > 2): add_score(Scoring.WINDOWS)
...https://stackoverflow.com/questions/55788577
复制相似问题