gpt4 book ai didi

python - 查找哪个对象不在列表中,但可能有重复项……棘手

转载 作者:行者123 更新时间:2023-11-28 22:18:58 26 4
gpt4 key购买 nike

标题不是很清楚,但很难描述我遇到的问题。

让我们考虑一个实现了 ==!= 方法的 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 个信号对象列表:

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) 之一。

通常在处理重复项时我使用集合,但是,我没有实现(而且我一生中从未实现过一次)对象的哈希方法......

感谢您帮助找到解决此问题的技巧:)

最佳答案

通常,您可以通过在唯一字段的元组上调用 hash() 来实现 __hash__,例如:

class Signal:
...
def __hash__(self):
return hash((self.fq, self.t0, self.tf))

然后:

>>> a = Signal(10, 20, 30)
>>> b = Signal(20, 30, 40)
>>> c = Signal(10, 20, 30) # same as a
>>> s = {a, b, c}
>>> len(s)
2

关于python - 查找哪个对象不在列表中,但可能有重复项……棘手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50136429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com