Python-TypeError:“ NoneType”对象不是可迭代的CodeWars退出代码-它们相同吗?

时间:2018-11-29 17:34:55

标签: python

所以我正在接受CodeWars的挑战,说:

“给出两个数组a和b,编写一个函数comp(a,b),该函数检查两个数组是否具有“ same”元素且具有相同的多重性。“ Same”在这里表示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

所以无论如何,我的代码中都有错误,哈哈。有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

由于列表的长度不同,您可能会犯的错误-您无法避免这种情况。

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)-f.e.考虑一下检查:

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

如果您使用输入中set()的排序列表而不是排序列表,则可以轻松地加快速度,这样您就可以消除大约99999999个检查,这会使运行时间有所减少(除非您的数据集仅包含开头的唯一值)。如果您有set()'s ..他们真的很快就会发现其中是否有东西-更好,更快,然后从...开始对庞大的列表进行排序。