Python 最大值(dict,dict.get),当dict项命名为tuple对象时

Python 最大值(dict,dict.get),当dict项命名为tuple对象时,python,dictionary,max,namedtuple,Python,Dictionary,Max,Namedtuple,我的目标是在字典中找到元素的id,其中相似度参数最高 我不确定我是否理解这两种方法为何工作相同,如果有人能解释一下,我将不胜感激 以下是我的python 3.6代码: class ParentCandidate(NamedTuple): similarity: float title: str c1 = ParentCandidate(0.875, 'longest title 1') c2 = ParentCandidate(1, 'title 2') c3 = Pare

我的目标是在字典中找到元素的id,其中相似度参数最高

我不确定我是否理解这两种方法为何工作相同,如果有人能解释一下,我将不胜感激

以下是我的python 3.6代码:


class ParentCandidate(NamedTuple):
    similarity: float
    title: str


c1 = ParentCandidate(0.875, 'longest title 1')
c2 = ParentCandidate(1, 'title 2')
c3 = ParentCandidate(0.9, 'title 3')
c4 = ParentCandidate(1.1, 'title 4')
c5 = ParentCandidate(0.5, 'title 5')

candidates = {1: c1, 2: c2, 3: c3, 4: c4, 5: c5}

closest_method1 = max(candidates, key=candidates.get)
closest_method2 = max(candidates, key=lambda sim: candidates[sim].similarity)
print(closest_method1, closest_method2)
assert closest_method1 == closest_method2
第二种方法完全按照计划工作,当我们直接引用它时,似乎很清楚我们是如何识别最大相似值的。 虽然我不明白max函数在接收命名的tuple对象进行比较时是如何工作的。

简化它。将NamedTuples和max从等式中取出来:

>>> (0.9, 'title 3') > (0.5, 'title 5')
True
元组可以直接进行比较。首先,检查第一个元素。因为上面的0.9大于0.5,所以认为第一个元组更大。但是,如果第一个元素相同,它将移动到第二个元素并检查它们。它会重复这个过程,直到找到一组元素,其中一个元素更大,或者它们被认为相等

这基本上扩展了这个想法,并检查从元组继承行为的命名元组中哪一个是最大的。这实际上意味着它正在检查元组的第一个元素,但是请注意,如果有两个元素具有相同的相似性,那么它将移动到title元素并对字符串进行字典排序!这可能不是您想要的,因此我将跳过使用该变体。

简化它。将NamedTuples和max从等式中取出来:

>>> (0.9, 'title 3') > (0.5, 'title 5')
True
元组可以直接进行比较。首先,检查第一个元素。因为上面的0.9大于0.5,所以认为第一个元组更大。但是,如果第一个元素相同,它将移动到第二个元素并检查它们。它会重复这个过程,直到找到一组元素,其中一个元素更大,或者它们被认为相等


这基本上扩展了这个想法,并检查从元组继承行为的命名元组中哪一个是最大的。这实际上意味着它正在检查元组的第一个元素,但是请注意,如果有两个元素具有相同的相似性,那么它将移动到title元素并对字符串进行字典排序!这可能不是您想要的,因此我将跳过使用该变体。

它们不完全相同。第一种方法是比较整个元组,第二种方法只是比较相似元素。第一种方法相当于

closest_method = max(candidates, key=lambda sim: candidates[sim])
当x是字典的键时,candidates.getx相当于candidates[x]。由于max会迭代该键,因此在此上下文索引中不能出现该键不存在的情况,因此会引发异常。默认情况下,.get返回None


如果所有的相似元素都是唯一的,那么这两种方法之间就不会有区别。但是如果存在重复的相似性值,.get方法将比较标题以对其进行排序。

它们并不完全相同。第一种方法是比较整个元组,第二种方法只是比较相似元素。第一种方法相当于

closest_method = max(candidates, key=lambda sim: candidates[sim])
当x是字典的键时,candidates.getx相当于candidates[x]。由于max会迭代该键,因此在此上下文索引中不能出现该键不存在的情况,因此会引发异常。默认情况下,.get返回None


如果所有的相似元素都是唯一的,那么这两种方法之间就不会有区别。但是,如果存在重复的相似性值,.get方法将比较标题以对其排序。

如果Parent候选项是元组而不是NamedTuples,您还会有问题吗?如果Parent候选项是元组而不是NamedTuples,您还会有问题吗?谢谢您的启发。谢谢您的启发。谢谢,投了赞成票,谢谢,投了赞成票。