Название не совсем понятно, но трудно описать проблему, с которой я столкнулся.
Давайте рассмотрим класс Signal
с реализованным методом ==
и !=
. (это упрощенная версия моей).
import numpy as np
class Signal:
def __init__(self, fq, t0, tf):
"""
Creation of the object.
"""
# Amplitude and shape
self.amp = float(8)
# Timing and frequency
self.t0 = t0
self.tf = tf
self.duration = round(self.tf - self.t0, 3)
self.fq = fq
self.timeline = np.round(np.arange(t0, tf, 1/fq*1000), 3)
def __eq__(self, s):
""" == comparison method."""
return self.fq == s.fq and self.t0 == s.t0 and self.tf == s.tf
def __ne__(self, s):
""" != comparison method."""
return not self.__eq__(self, s)
Теперь давайте рассмотрим 2 списка объектов Signal:
t0 = 0
tf = 200
desired_n = [Signal(20, t0, tf), Signal(30, t0, tf), Signal(40, t0, tf)]
desired_n_minus_1 = [Signal(20, t0, tf), Signal(30, t0, tf)]
Чтобы найти, какой сигнал отсутствует в desired_n_minus_1
, я просто зацикливаюсь и проверяю:
for s in desired_n:
if s not in desired_n_minus_1:
signal_missing = s
break
Отлично, это работает! Однако ... в этом и заключается хитрость: у меня может быть один и тот же сигнал несколько раз в списке desired_n
. Пример:
t0 = 0
tf = 200
desired_n = [Signal(20, t0, tf), Signal(30, t0, tf), Signal(30, t0, tf)]
desired_n_minus_1 = [Signal(20, t0, tf), Signal(30, t0, tf)]
В этом случае мое решение больше не работает, и мне нужна программа для возврата Signal(30, t0, tf)
. Мне все равно, какой из 2 он возвращает.
И это не так, тут худший случай:
t0 = 0
tf = 200
desired_n = [Signal(20, t0, tf), Signal(20, t0, tf), Signal(30, t0, tf), Signal(30, t0, tf)]
desired_n_minus_1 = [Signal(20, t0, tf), Signal(30, t0, tf), Signal(30, t0, tf)]
В этом случае мне нужно вернуть один из 2 Signal(20, t0, tf)
.
Обычно при работе с дубликатами я использую наборы, однако я не реализовывал (и никогда не делал ни разу в своей жизни) метод хеширования для объекта ...
Спасибо за помощь, чтобы найти выход из этой проблемы:)