首页 > 解决方案 > Python - TypeError:'NoneType' 对象在 CodeWars 中不可迭代退出代码 - 它们是否相同?

问题描述

所以我正在做一个来自 CodeWars 的挑战,上面写着:

“给定两个数组 a 和 b,编写一个函数 comp(a, b),检查这两个数组是否具有“相同”元素,具有相同的多重性。“相同”在这里意味着 b 中的元素是一个平方,无论顺序如何。”

我的代码是:

def comp(array1, array2):
    if array1==None or array2==None:
        return False
    array1 = list(array1)
    array2 = list(array2)
    array1.sort()
    array2.sort()
    z= 0
    for i in range(len(array1)):
            if array1[i]**2 == array2[i]:
                z+=1
    if z == len(array1):
        return True
    else:
        return False

现在,我知道这个任务必须有更简单的代码,但我仍然是一个初学者程序员。

所以所有的测试都通过了。但我不断收到退出代码:

Traceback (most recent call last):
  File "main.py", line 21, in <module>
    test.assert_equals(comp(a1, a2), False)
  File "/home/codewarrior/solution.py", line 10, in comp
   if array1[i]**2 == array2[i]:
IndexError: list index out of range

如果我删除第一个“if array1= None.... return False”语句,它会给出这个退出代码:

Traceback (most recent call last):
  File "main.py", line 18, in <module>
    test.assert_equals(comp(a1, a2), False)
  File "/home/codewarrior/solution.py", line 3, in comp
    array2 = list(array2)
TypeError: 'NoneType' object is not iterable

所以无论如何,我的代码有问题,哈哈。有什么解决办法吗?

标签: python

解决方案


您可能会出现的错误是由于列表的长度不同 - 您不会对此有所防范。

comp([1,2,3], [1,2])

您可以enumerate()在一个数组上使用简化代码,然后查看另一个数组。我非常怀疑您的数组是否需要放入列表中-它们可能已经是-即使您可以使用以下步骤一步完成sorted()

def comp(array1, array2):
    if array1 is None or array2 is None: # compare to None with is
        return False
    if len(array1) != len(array2):
        return False

    array1 = sorted(array1)
    array2 = sorted(array2)

    for idx,num in enumerate(array1):
        if num*num != array2[idx]:
            return False  # early return on first mismatch
    return True

如果您进行更多优化,您仍然可能会获得更好的结果 - 但您可以在自己的时间做到这一点:o) ​​- 请考虑对此进行检查:

comp( [2]*100000000,[4]*100000000)

如果您使用set()输入的排序列表而不是排序列表,则可以轻松加快速度,这样您就可以消除大约 99999999 次检查,这会影响您的运行时(除非您的数据集只包含唯一值开始) . 如果你有set()'s .. 如果有东西在里面,他们会非常快地查找 - 比从开始排序大列表更好更快...


推荐阅读