【问题标题】:Is there a better way to write this "if" boolean evaluation?有没有更好的方法来编写这个“if”布尔评估?
【发布时间】:2012-11-27 17:31:55
【问题描述】:

我有这个我写的小sn-p python 代码。它有效,但我认为应该有一种更简化的方法来实现相同的结果。我只是没看到。有什么想法吗?

if tx_avt >= 100: tx = 1 
elif tx_avt < 100 and tx_avt >= 50: tx = 2 
elif tx_avt < 50 and tx_avt >= 25: tx = 3
elif tx_avt < 25 and tx_avt >= 12.5: tx = 4 
else: tx = 5

【问题讨论】:

  • 如果你把作业放在他们自己的行上适当缩进,这会更易读。

标签: python if-statement


【解决方案1】:

你可以改成:

if tx_avt >= 100: tx = 1 
elif tx_avt >= 50: tx = 2 
elif tx_avt >= 25: tx = 3
elif tx_avt >= 12.5: tx = 4 
else: tx = 5

说明:

  • 如果if tx_avt &gt;= 100不为真,那么您可以推断tx_avt &lt; 100必须为真。
  • 这消除了在检查“elif tx_avt &lt; 100 and tx_avt &gt;= 50:”中执行“tx_avt &lt; 100”部分的需要。

相同的逻辑级联并适用于其余的elif 案例。


相关阅读:Why Python Doesn't Have a Switch Statement, and its Alternatives.

【讨论】:

  • 迄今为止最完整的答案!
  • 啊当然!现在对我来说很明显!出于某种原因,我脑子里有它,我必须用 AND 语句在数字之间进行评估。感谢您的澄清。理想情况下,如果我使用的是 c++,我会使用 switch/case 语句。干净多了。就这样吧。我会检查链接。
【解决方案2】:

你不需要 elifs 的上限,因为这些是由它们上面的子句解决的......

elif tx_avt >= 50 : #do something
elif tx_avt >= 25 : #somthing else

在 python 中你可以做一个旁注

if 3 < ab < 10 : #check if ab is between 3 and 10

【讨论】:

  • 间隔检查很有趣!您知道在语言参考中可以找到它吗?很想看看除整数以外的其他类型的评估是如何工作的
  • 啊,这是一个有趣的花絮,我不知道 Pyhton。谢谢!
【解决方案3】:

如果你的 if-elif-else 链变得很长,你可以使用这个方法:

for amt, tx in [(100, 1), (50, 2), (25, 3), (12.5, 4)]:
    if tx_avt >= amt:
        break
else:
    tx = 5

注意:for 循环的else 子句在没有遇到break 时执行。在这种情况下,它用于提供默认情况。

【讨论】:

  • 你的注释有点错误......如果你在退出循环时不在 if 或 elif 块中,则执行 else ...
  • @JoranBeasley:不正确。请参阅 Python 文档4.4. break and continue Statements, and else Clauses on Loops:“循环语句可能有一个else 子句;当循环因列表用尽而终止时(for)或条件变为假(while)时执行,但是不是当循环被break 语句终止时。"
  • 哦,很酷,谢谢:) ...我认为这些执行方式不同,但很高兴知道
【解决方案4】:

换一种说法,这可以使用 bisect 模块中的二分搜索功能在一个单行中完成。

In [106]: def index(a,x):
   .....:         return len(a) - bisect.bisect_right(a, x) + 1
   .....:

In [107]: a=[12.5,25,50,100]

In [108]: index(a,15)
Out[108]: 4

In [109]: index(a,25)
Out[109]: 3

In [110]: index(a,35)
Out[110]: 3

In [111]: index(a,50)
Out[111]: 2

In [112]: index(a,100)
Out[112]: 1

【讨论】:

    【解决方案5】:

    基于 [12.5, 25, 50, 100] 是一个系列这一事实的另一个想法:

    MAX_BOUNDARY = 5
    for tx, boundary in [(n, 25 * 2**(-n+3)) for n in range(1, MAX_BOUNDARY)]:
        if tx_avt >= boundary:
            break
    else:
        tx = MAX_BOUNDARY
    

    (这是@StevenRumbalski 版本稍作修改)

    如果 tx_avt 的分布是均匀的(w.r.t. 系列函数)并且您的列表变得非常大,这可以与 @WaiYipTung 关于 bisect 的想法相结合,用于 O(log(n)) 搜索。

    否则,您应该坚持使用@JoranBeasley 和@SampsonChen 建议的更简单、更易于理解的解决方案。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多