【问题标题】:cleaner way to do a simple comparison using any?使用 any 进行简单比较的更清洁方法?
【发布时间】:2021-02-20 07:42:16
【问题描述】:

一些背景

我正在为用户提交的代码设置一些测试,以进行极其简单的数据科学测试。

编码“挑战”在 Jupyter Notepook 中的结构如下:

li1 = [2,4,3,-2,-1,5,10]
li2 = [5,4,-3,7,8,-5,10,9]
def findMedian(li):
    li.sort()

    # find the median of li...
    # your code below

    listlength = len(li)
    num = listlength//2
    if listlength % 2 == 0:
        return (li[num]+li[num-1])/2
    else:
        return li[num]
if findMedian(li1) == 3:
    print("1 is correct!")
else:
    print("1 is wrong")
if findMedian(li2) == 6:
    print("2 is correct!")
else:
    print("2 is wrong")

现在虽然这已经足够好了,但我决定我可能应该实现类似以下的东西来真正检查许多情况。

from statistics import median
import random

x = [list(range(random.randint(1,50))) for i in range(1,100)]

print(not any([False if findMedian(i) == median(i) else True for i in x]))

问题是,使用not any() 感觉不对,我已经做了一段时间了,我觉得我的知识有点差距......

问题

有没有更简洁的方式来表达我的比较?

同时 not any([False if findMedian(i) == median(i) else True for i in x]) 完成这项工作,是否有更有效/pythonic 的方式来表达这一点?

【问题讨论】:

  • 一个快速的改进是使用生成器表达式而不是列表推导式。如果您严格首先生成数据(尽管这无关紧要),那么您就无法充分利用any 的提前退出。此外,使用三元来评估 True/False 是关闭的。就做print(not any(findMedian(i) != median(i) for i in x))
  • 哦,我没想到。我很乐意接受该编辑作为答案,感谢您的详细说明!
  • False if findMedian(i) == median(i) else True 是写findMedian(i) != median(i) 的一种非常复杂的方式。
  • 另外,not-any-not 公式是一种非常复杂的写作方式all(findMedian(i) == median(i) for i in x)
  • 爱戴摩根定律。

标签: python testing


【解决方案1】:

首先,列表是不必要的。请改用generator expression,这样会更有效,因为它允许any/all to short-circuit

接下来,False if x == y else Truenot x == y 相同,for most objects 包括整数,x != y

最后,感谢De Morgan's laws,您可以使用all(...) 代替not any(not ...)

all(findMedian(i) == median(i) for i in x)

【讨论】:

  • 感谢总部的回答+参考!
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2013-01-29
相关资源
最近更新 更多