関数に基づく対称差

Beginner

This tutorial is from open-source community. Access the source code

はじめに

Python では、2 つのリストの対称差は、元のリストのどちらかには含まれているが、両方には含まれていないすべての要素を含む新しいリストです。このチャレンジでは、与えられた関数を両方のリストの各要素に適用した後、2 つのリストの対称差を返す関数を書きます。

関数に基づく対称差

symmetric_difference_by(a, b, fn) という関数を書きます。この関数は、2 つのリスト ab と、関数 fn を引数に取ります。この関数は、与えられた関数を両方のリストの各要素に適用した後、元のリストのどちらかには含まれているが、両方には含まれていないすべての要素を含む新しいリストを返す必要があります。

この問題を解くには、次の手順をたどることができます。

  1. 各リストの各要素に fn を適用することで set を作成します。
  2. それぞれに対して、fn と組み合わせたリスト内包表記を使用して、他方の先に作成した set に含まれていない値のみを残します。
  3. 手順 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 つのリストの対称差を返す関数を書く方法を学びました。これを達成するために、集合とリスト内包表記を使用しました。