同じ長さの 2 つのリストを比較したい
a = [1, 3, 5, 7, 9]
b = [1, 2, 5, 7, 3]
n
この場合は になります。n = 2
また、長さが等しくない場合はエラーを返します。これを行うpythonicの方法は何ですか?
これを行う最も簡単な方法は、sum()
組み込み式とジェネレーター式を使用することです。
def differences(a, b):
if len(a) != len(b):
raise ValueError("Lists of different length.")
return sum(i != j for i, j in zip(a, b))
を使用してリストをまとめてループし、zip()
それらを比較します。True == 1
とのようにFalse == 0
、これを合計して差の数を取得します。別のオプションは、ジェネレーター式の条件部分を使用することです。
sum(1 for i, j in zip(a, b) if i != j)
どちらかが読みやすいとは言えませんし、パフォーマンスに違いがあるとは思えません。
長さが等しくない場合にもエラーを生成するワンライナーソリューション:
>>> sum(map(lambda x,y: bool(x-y),a,b))
2
次に、異なる長さの入力を試してください。
>>> sum(map(lambda x,y: bool(x-y),[1,2],[1]))
TypeError
仕組み: bool(x,y) は、要素が異なる場合に True を返します。次に、この関数を 2 つのリストにマップし、[False、True、False、True、False] のリストを取得します。
関数 map() に異なる長さのリストを入れると、TypeError が返されます
最後に、このブール値リストの関数 sum() は 2 を返します。
セットを使用できます。両方をセットにキャストしてから、2 つの違いを見つけます。例えば:
>>> a = [1,3,5,7,9]
>>> b = [1,2,5,7,2]
>>> len(set(a) - set(b))
2
これは、最初に長さの違いをチェックする関数にまとめることができます。