【问题标题】:Less than Or Greater Than Comparison as a Variable in Python小于或大于比较作为 Python 中的变量
【发布时间】:2014-04-28 18:59:56
【问题描述】:

我在一个函数中有一段代码可以进行一些比较,即:

if customer_info['total_dls'] < min_training_actions \
or customer_info['percentage'] > train_perc_cutoff:
    continue
elif customer_id not in test_set \
or test_set[customer_id]['total_dls'] < min_testing_actions:
    num_uncertain +=1
    continue
elif test_set[customer_id]['percentage'] <= test_perc_cutoff:
    num_correct +=1
else:
    num_incorrect +=1

现在有时我需要将这些比较大于,有时我需要它们小于。其余所有代码完全相同。现在,我可以只创建两个重用基本相同代码的函数,但在此之前,是否有一些干净的方法可以对比较运算符进行变量化,所以我可以使用相同的代码块并将比较作为变量传递?类似:compare(var1, var2, polarity)我知道我可以自己制作,但我想知道在这种情况下的标准是什么。是否有一些我不知道的非常pythonic的方式来做到这一点?

[编辑] 强调问题最重要的部分[/编辑]

【问题讨论】:

  • 您的缩进似乎已关闭,很难看出您的确切意思。
  • 我认为在任何时候你会打电话给compare(var1, var2, operator.lt) 左右,这只是写var1 &lt; var2 的一种混淆方式。

标签: python comparison-operators


【解决方案1】:

您可以使用operator module;它具有充当比较运算符的功能:

import operator

if foobar:
    comp = operator.lt
else:
    comp = operator.gt

if comp(spam, eggs):

这将使用测试如果spam 小于或大于eggs,取决于foobar 的真实性。

这完全符合您的作为变量的比较要求。

这当然是我用来避免重复自己的方法;如果您有两段代码在比较方向上有所不同,请使用operators 中的函数来参数化比较。

【讨论】:

  • 同意@RemcoGerlich。我正在寻找一种干净的 Pythonic 方式来做到这一点。我在想只做另一个功能会比上面的更干净。
  • @RemcoGerlich:如果两个较大的代码路径之间的唯一区别是运算符,那么是的。
  • 其实不然,被比较的变量也不同。
  • @RemcoGerlich:这是最难的部分,是吗?
  • @SerpentineCougar 是的,我的错误,现在更正了。谢谢!
【解决方案2】:

在尝试为未知 ML 模型构建模块时,我遇到了同样的问题。有些需要最低分数才能执行,有些则需要最高分数,具体取决于所使用的指标。我传入了一个“大于”布尔变量并编写了一个小函数:

def is_better(gt,a,b): 
    return a>b if gt else a<b

【讨论】:

    【解决方案3】:

    我不会通过以任何方式使操作符动态化来重构它。我认为这些比较不是那么相似,并且迫使它们看起来更相似会混淆代码。这有点像红鲱鱼。

    我会将复杂的检查放在一个函数中,比如

    def customer_trained_enough(customer_info):
        return (
            customer_info['total_dls'] < min_training_actions
            or customer_info['percentage'] > train_perc_cutoff)
    
    def customer_tested_enough(test_info):
        return test_info['total_dls'] >= min_testing_actions
    
    def percentage_too_high(test_info):
        return test_info['percentage'] > test_perc_cutoff
    

    然后代码变成:

    if customer_trained_enough(customer_info):
        continue
    if (customer_id not in test_set or
        not customer_tested_enough(test_set[customer_id])):
        num_uncertain += 1
    elif not percentage_too_high(test_set[customer_id]):
        num_correct += 1
          else:
        num_incorrect += 1
    

    我猜到了函数的一些名称,并且不得不否定其中两个中的逻辑以使名称起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多