考虑两个列表(从1到N(arr)的数字序列和相同的序列混合但缺少一个数字(mixed_arr))。目标是找到已删除的号码。
示例:
arr = [1,2,3,4,5]
mixed_arr = [3,4,1,5]
输出应为2。
如果没有删除号码且没有差异,则返回0 如果没有从数组中删除任何数字并且没有差别,则函数必须返回0.注意N可以是1或更小(在后一种情况下,第一个数组将是[])。
测试用例:
arr = [1,2,3,4,5,6,7,8,9]
mixed_arr = [1,9,7,4,6,2,3,8]
output = 5
arr = [1,2,3,4,5,6,7,8,9]
mixed_arr = [5,7,6,9,4,8,1,2,3]
output = 0
这是我的代码:
def find_deleted_number(arr, mixed_arr):
arr.sort()
mixed_arr.sort()
for x in range(arr):
for y in range(mixed_arr):
if arr[x] != mixed_arr[y]:
return arr[x]
elif arr[x] == mixed_arr[y]:
return 0
我得到的错误是:
Traceback:
in <module>
in find_deleted_number
TypeError: 'list' object cannot be interpreted as an integer
答案 0 :(得分:3)
为什么不使用set
?
>>> arr = [1,2,3,4,5,6,7,8,9]
>>> mixed_arr = [1,9,7,4,6,2,3,8]
>>> list(set(arr) - set(mixed_arr))
[5]
这个通用解决方案将处理不对整数或列表大小(或差异大小)进行约束的数组。
修改。在正整数的特定情况下,在另一个数组中只有一个 ,&#39;使用以下评论中的解决方案更有效:
>>> abs(sum(arr) - sum(mixed_arr))
5
答案 1 :(得分:2)
您只需使用symmetric_difference()
的成员set
:
set(arr).symmetric_difference(mixed_arr)
另见sets。
请注意,正如DeepSpace在评论中指出的那样,如果保证两个列表都包含从1到N的整数,除了其中一个列表中缺少一个,则更有效的解决方案是计算两个列表之和的差值的绝对值:
abs(sum(arr) - sum(mixed_arr))
您获得的错误:
由于此行,您收到错误:
for x in range(arr): # arr is a list, not an int
你肯定打算传递数组的长度:
for x in range(len(arr)):
内循环也是如此。
答案 2 :(得分:1)
您的问题是您正在尝试将列表对象传递给range()
函数。但由于range()
只接受整数,因此Python抱怨道。您也使用mixed_arr
犯了同样的错误。
但是有更简单的方法来实现这一目标。在这种情况下,您可以使用set()
来查找两个列表之间的区别:
>>> set([1,2,3,4,5]) - set([3,4,1,5])
{2}
>>>
或者这可以使用简单的列表理解来完成:
>>> arr = [1,2,3,4,5]
>>> mixed_arr = [3,4,1,5]
>>>
>>> [el for el in arr if el not in mixed_arr]
[2]
>>>