首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -基于多个数据点的评分

python -基于多个数据点的评分
EN

Stack Overflow用户
提问于 2019-04-22 02:46:22
回答 2查看 644关注 0票数 1

在最简单的方法上需要指导。我有多个资产,每个资产都有多个数据点。我希望根据对每个数据点的决策为每个资产分配一个值。例如,每一项资产都是一所房子,而数据点包括窗户、车库门、破篱笆等,每个房子都有一个分数。

除了数以百计的if语句和加/减分数之外,还有推荐的编码方法吗?

我打算怎么做的例子

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-22 06:55:26

我认为您也可以在这里使用“责任链”模式:

该模式允许多个对象处理请求,而无需将发送方类耦合到接收方的具体类。该链可以在运行时与遵循标准处理程序接口的任何处理程序动态组合。

使用这种模式的好处是,您可以在不同的模块中定义和扩展不同的评分器,并根据问题条件在运行时动态地组合它们。这是你怎么做的。首先,定义父记分员类:

代码语言:javascript
复制
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]

然后,定义各种记分员类,例如:

代码语言:javascript
复制
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)

这就是如何使用它:

代码语言:javascript
复制
scorer = BaseScorer.chain([
    WindowScorer(),
    GarageScorer(),
    FenceScorer()
])

house = House(windows=4, garage=True, fence='nice')
score = scorer.score(house)
票数 1
EN

Stack Overflow用户

发布于 2019-04-22 03:11:50

我认为你的方法很好,不值得去尝试做其他的事情。您可能希望通过定义如下函数来更多地组织它:

代码语言:javascript
复制
def add_score(x, score): 
    score += x
    return score

像这样的dictionary

代码语言:javascript
复制
sdict = {windows: 10, garage: 10, broken_fence: 10}

这样您就可以像这样调用您的函数:

代码语言:javascript
复制
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 (现在仔细考虑了,也许应该)

代码语言:javascript
复制
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)
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55788577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档