はじめに
Python では、2 つのリストの対称差は、元のリストのどちらかには含まれているが、両方には含まれていないすべての要素を含む新しいリストです。このチャレンジでは、与えられた関数を両方のリストの各要素に適用した後、2 つのリストの対称差を返す関数を書きます。
関数に基づく対称差
symmetric_difference_by(a, b, fn) という関数を書きます。この関数は、2 つのリスト a と b と、関数 fn を引数に取ります。この関数は、与えられた関数を両方のリストの各要素に適用した後、元のリストのどちらかには含まれているが、両方には含まれていないすべての要素を含む新しいリストを返す必要があります。
この問題を解くには、次の手順をたどることができます。
- 各リストの各要素に
fnを適用することでsetを作成します。 - それぞれに対して、
fnと組み合わせたリスト内包表記を使用して、他方の先に作成したsetに含まれていない値のみを残します。 - 手順 2 で得られた 2 つのリストを連結します。
この関数は次のパラメータを持つ必要があります。
a: 要素のリストb: 要素のリストfn: 要素を取り、新しい値を返す関数
この関数は、与えられた関数を両方のリストの各要素に適用した後、元のリストのどちらかには含まれているが、両方には含まれていないすべての要素を含む新しいリストを返す必要があります。
def symmetric_difference_by(a, b, fn):
(_a, _b) = (set(map(fn, a)), set(map(fn, b)))
return [item for item in a if fn(item) not in _b] + [item
for item in b if fn(item) not in _a]
from math import floor
symmetric_difference_by([2.1, 1.2], [2.3, 3.4], floor) ## [1.2, 3.4]
まとめ
このチャレンジでは、与えられた関数を両方のリストの各要素に適用した後、2 つのリストの対称差を返す関数を書く方法を学びました。これを達成するために、集合とリスト内包表記を使用しました。