array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array2 = [1, 2, 2, 2, 5, 6, 6, 6, 9]
temp = set(array2)
array1.remove(temp)
Traceback (most recent call last):
File "Sudoku V2.py", line 6, in <module>
array1.remove(temp)
ValueError: list.remove(x): x not in list
6 に答える
これを試して:
array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array2 = [1, 2, 2, 2, 5, 6, 6, 6, 9]
set(array1).difference(array2)
=> set([3, 4, 7, 8])
上記では、セットのdifference()メソッドを使用しています。このメソッドは、パラメーターとして受け取った iterable(s) にないセット内の要素を持つ新しいセットを返します。array2
これが機能するためにセットに変換する必要がないことに注意してください。
また、セットを使用すると、すべての重複要素が削除され、イテラブルの元の順序が必ずしも保持されるとは限らないことに注意してください。それが問題である場合は、次の代替ソリューションを試してください。
[x for x in array1 if x not in array2]
=> [3, 4, 7, 8]
結果の要素の順序や重複要素を気にしない場合はset.difference
、Óscar Lópezの答えのように、まさにあなたが望むものです。
順序と重複を気にする場合、最も簡単な方法は、新しいリストを作成して、 内のものを除外することですarray2
。
set2 = set(array2)
array1 = [item for item in array1 if item not in set2]
新しいものを構築するのではなく、その場で破壊的に変更する必要がある場合はarray1
、ほとんどの場合、array1
すべてのコンテンツを一度に破壊的に置き換える方が簡単です。
array1[:] = [item for item in array1 if item not in set2]
本当に要素ごとに変更したい場合は、array1
逆方向に反復してインプレースを削除するのが最善の方法です。
set2 = set(array2)
for i, value in enumerate(array1)[::-1]:
if value in set2:
del array1[i]
最後に、 flornquake が提案した方法でそれを行うことができset
ますが、それは;を利用しないため、線形ではなく二次時間がかかります。の各要素に対してset2
、線形を実行しarray1.remove
ます。
配列 1 - 配列 2 が必要ですか?
set1 = セット (配列 1)
set2 = セット (配列 2)
set1.difference(set2) はあなたが望むものです。
s -> シーケンス
s.remove(x) remove the first item from s where s[i] == x
remove raises ValueError when x is not found in s.
http://docs.python.org/3/library/stdtypes.html#index-23
array1 のどの要素もセットではありません。array1 のすべての要素は整数です。