所以我正在接受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
所以无论如何,我的代码中都有错误,哈哈。有什么解决办法吗?
答案 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 ..他们真的很快就会发现其中是否有东西-更好,更快,然后从...开始对庞大的列表进行排序。