2017-07-07 19 views
0

2つのリスト(1からN(arr)までの一連の数字と同じシーケンスが混在していますが、1つの数字(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 
+1

範囲(arr): 'と' for x in range(mixed_arr): 'の範囲を削除し、' arr [x] '、' x'だけを呼び出す必要はない – PRMoureu

+1

あなたの問題はリストオブジェクトを 'range()'関数に渡そうとしています。しかし、 'range()'は整数しか受け付けないので、Pythonは文句を言います。 –

+1

range()を削除するだけでなく、xとyはインデックスではなく配列内の値になります。 – Bryan

答えて

2

あなたは単に、メンバーをsymmetric_difference()を使用することができますsetの:

set(arr).symmetric_difference(mixed_arr) 

sets参照してください。

両方のリストは、1からNまでの整数を含んでいることが保証されている場合、これらのリストのいずれかで行方不明1を除いて、はるかに効率的なソリューションを計算することである、コメントでDeepSpaceで指摘したように、注意してください両方のリストの和の差の絶対値:

abs(sum(arr) - sum(mixed_arr)) 

エラーあなたが取得している:あなたがあるため、この行のエラーを取得している

for x in range(arr): # arr is a list, not an int 

あなたはきっと、配列の長さを渡すためのもの:

for x in range(len(arr)): 

同じことが内部ループのために行きます。

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] 

この一般解は整数で、またはリストのサイズ(または差の大きさ)に制約なしでアレイを処理します。

編集。正の整数、および他のアレイでを逃す一つだけのあなたの(非常に)特定のケースで、それは以下のコメントからソリューションを使用することがはるかに効率的です:

>>> abs(sum(arr) - sum(mixed_arr)) 
5 
+1

これにより正しい結果が得られますが、定義によってそれぞれ固有の要素があるため、2つの配列の合計の差を返すことができます。 – DeepSpace

+1

@DeepSpace差の絶対値です。 –

+2

あなたは本当に正しいです、この特定のケースでは、はるかに効率的です。 – randomir

1

あなたの問題は、あなたがしていることですリストオブジェクトをrange()関数に渡そうとしています。しかし、range()は整数しか受け付けないので、Pythonは文句を言います。 mixed_arrと同じ間違いをしています。

しかし、これを達成するための簡単な方法があります。この場合は、次の2つのリストの違いを見つけるためにset() Sを使用することができます。

>>> 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] 
>>> 
関連する問題