Разница симметрическая на основе функции

Beginner

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

Введение

В Python симметрическая разница между двумя списками - это новый список, содержащий все элементы, которые находятся в одном из исходных списков, но не в обоих. В этом испытании мы напишем функцию, которая возвращает симметрическую разницу между двумя списками, после применения заданной функции к каждому элементу обоих списков.

Симметрическая разница на основе функции

Напишите функцию symmetric_difference_by(a, b, fn), которая принимает два списка a и b и функцию fn. Функция должна возвращать новый список, содержащий все элементы, которые находятся в одном из исходных списков, но не в обоих, после применения заданной функции к каждому элементу обоих списков.

Для решения этой проблемы вы можете следовать следующим шагам:

  1. Создайте множество, применяя fn к каждому элементу в каждом списке.
  2. Используйте генератор списка в сочетании с fn для каждого из них, чтобы оставить только значения, не содержащиеся в предварительно созданном наборе другого списка.
  3. Объедините два списка, полученных на шаге 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]

Резюме

В этом испытании мы научились писать функцию, которая возвращает симметрическую разницу между двумя списками, после применения заданной функции к каждому элементу обоих списков. Мы использовали множество и генератор списка, чтобы достичь этого.