从列表中查找已删除的号码

时间:2017-07-07 22:15:28

标签: python

考虑两个列表(从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

3 个答案:

答案 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]
>>>