为什么在dict中,当我们具有具有不同键名称的相同值时,为什么它会选择一个与另一个进行比较


   >>> votes ={}
    >>> votes["maddy"]=6
    >>> votes["katty"]=6
    >>> votes

   {'maddy': 6, 'katty': 6}
    >>> print(max(votes.items(), key = lambda k:k[1]))
    ('maddy', 6)
    >>> votes["jackie"]=1
    >>> votes
    {'maddy': 6, 'katty': 6, 'jackie': 1}
    >>> votes["kavi"]=1
    >>> votes
    {'maddy': 6, 'katty': 6, 'jackie': 1, 'kavi': 1}
    >>> print(min(votes.items(), key = lambda k:k[1]))
    ('jackie', 1)
    >>> 

我知道无论我们首先插入带有最大值的项目是什么,都将是 被视为最大票数,如下所示,但如果我需要最大值怎么办 如 值为 6 的 Katty 键,插入在具有相同值的 Maddy 键之后 值 6 ?

    print(max(votes.items(), key = lambda k:k[1]))
 ('maddy', 6)
expected output is 
Katty , 6

根据max文档:

如果多个项目最多,则该函数返回遇到的第一个项目。

此外,您的代码还取决于 .items() 返回的元素的顺序。自 Python3.7 以来,dict保证了插入顺序(在此处阅读更多相关信息(。如果您的版本低于 3.7,并且您希望保持元素的插入顺序,则可以使用 OrderedDict

如果要返回具有最大值/最小值的最新元素,可以在键中显式指定顺序:

In [1]: votes = {'maddy': 6, 'katty': 6}
In [2]: max(votes.items(), key=lambda x: x[1])
Out[2]: ('maddy', 6)
In [3]: max(enumerate(votes.items()), key=lambda x: (x[1][1], x[0]))
Out[3]: (1, ('katty', 6))
In [4]: max(enumerate(votes.items()), key=lambda x: (x[1][1], x[0]))[1]
Out[4]: ('katty', 6)

请注意,对于min,您需要在 key 函数中否定索引以检索最新元素。这是使具有索引的元素(例如(比具有索引 2 的元素低 3 所必需的。否定索引后,您将比较 -3 与 -2,-3 将低于 -2,因此min将返回具有较高索引的元素:

In [5]: votes = {'maddy': 6, 'katty': 6, 'a': 1, 'b': 1}
In [6]: min(enumerate(votes.items()), key=lambda x: (x[1][1], -x[0]))[1]
Out[6]: ('b', 1)

或者您可以颠倒项目的顺序:

In [7]: max(reversed(list(votes.items())), key=lambda x: x[1])
Out[7]: ('katty', 6)

最新更新