【问题标题】:Can't figure out this Kata想不通这个卡塔
【发布时间】:2017-08-19 00:01:18
【问题描述】:

我正在 CodeWars 中处理这个 Kata,我通过了除一项测试外的所有测试,但它没有说明错误是什么。描述说要检查两个列表的多重性。列表 a2 是列表 a1 的正方形列表。我需要在 a1 中检查 a2 中所有项目的平方根,如果数组为空、None 或平方根不在 a1 中,则返回 false。

我希望得到您可能有的任何提示,这些提示不仅涉及功能(使其更加 Pythonic),还涉及错误处理。我错过了什么?为什么不通过?提前致谢。

def comp(a1, a2):
    if a1 == [] or a2 == []:
        return False
    if a1 == None or a2 == None:
        return False
    pos_count = 0
    neg_count = 0
    for num in set(a2):
        if num**0.5 in set(a1):
            pos_count += 1
        else:
            neg_count += 1
    if neg_count > 0:
        return False
    else:
        return True

【问题讨论】:

  • 对于a1中的每个数字;如果 number 乘以 number 不在 a2 中;返回假。如果 a1 数字用尽,则返回 True。
  • 在 shell 中,尝试2 * 2。结果是 4,一个整数。现在试试4 ** .5。结果是 2.0 个浮点数。当你在a2 中取一个数字的平方根时,结果可能是一个带有一些floating point errors 的浮点数。当您尝试将其与a1 中的整数进行比较时,比较可能会失败。无论如何,这只是对正在发生的事情的猜测。
  • 好吧,我的浮点误差理论可能不正确,我只是检查了 a1 中 0 到 100000 的整数及其在 a2 中的平方 - 您的函数适用于所有这些。
  • 如果您需要测试两个列表的多重性,那么如果您在a1 中有2,但在a2 中没有4,这个函数不仍然是return Truea2 中的 2x4a1 中只有一个 2 呢?
  • 如果num 是负数怎么办? num ** 0.5 带给你什么?

标签: python error-handling


【解决方案1】:

您可以改进作为评论发布的代码:

def comp(a1, a2):
    if a1 is None or a2 is None:
        return False
    num_squared = []
    for num1 in a1:
        num_squared.append(num1**2)
    if set(a2) == set(num_squared):
        return True
    else:
        return False

您可以使用理解表达式构建序列。您可以通过将正方形附加到一个空列表来构建一个列表,但您可以这样做:

num_squared = [num ** 2 for num in a1]

您创建一个临时的set 对象set(num_squared)。但是,您可以以与列表相同的方式构建集合:

num_squared = {num ** 2 for num in a1}

如果你有一个布尔表达式然后返回 True 否则 False 你可以用表达式本身替换它:

return set(a2) == set(num_squared)

应用所有这些更改,您可以获得:

def comp(a1, a2):
    if a1 is None or a2 is None:
        return False
    else:
        return set(a2) == {num ** 2 for num in a1}

编辑:请注意:

空列表在布尔表达式中计算为False

>>> bool([])
False

另外,None 评估 False

>>> bool(None)
False

【讨论】:

  • 非常感谢@peter-wood。我知道我的代码在这一点上很笨拙,感谢您的指导以简化它!
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 2023-02-14
  • 1970-01-01
  • 2013-09-28
  • 2016-02-10
  • 2015-06-28
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多