将max与“get”方法一起用于字典

2024-05-15 01:59:42 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我看了这个演示,它向我介绍了一种在字典中找到最大值的方法。这对这里的大多数人来说可能没有任何突破,但事实是:

c = {"One":1, "Two":2, "Uns":1}
max(c,key=c.get)
'Two'

我不太明白它是怎么工作的。如果字典中存在键,“get”方法返回键的值。那么,“max”是否遍历每个键,找到关联的值,然后返回与最大值关联的键?当字典有多个最大值时,它是如何工作的?你知道吗

c = {"One":1, "Two":2, "Uns":1, "Dos": 2}
max(c,key=c.get)
'Dos'

所以,为了进一步试验和迷惑自己,我尝试了以下方法:

c = {"One":1, "Two":2, "Uns":1}
max(c.values(),key=c.get)
1

那么,它为什么返回“1”而不是“2”?请解开这个灵魂!你知道吗


Tags: 方法keyget字典onemax事实values
2条回答

当你打电话时:

max(c, key=c.get)

max函数在内部迭代第一个参数;对于字典,它将迭代字典的。。。一些秩序,这是事情变得毛茸茸的地方。你知道吗

  • 在Python3.6之前,这个顺序是任意的,不能保证是任何特定的顺序
  • 在python3.6的CPython实现中,作为实现细节,将键插入字典的顺序更改为键插入字典的顺序。(在您的例子中,它们在文本中的书写顺序,因此"One""Two""Uns""Dos"
  • 从python3.7开始,语言规范就保证了这种行为。你知道吗

(另请参见Python documentation on the ^{} type。)

现在我们知道max()函数将看到两个可能的键,它们依次映射到最大值"Two""Dos"documentation for the ^{} function表示:

If multiple items are maximal, the function returns the first one encountered.

因此,在Python 3.7和CPython 3.6中,返回的内容取决于键插入字典的顺序:

>>> c = {"Uns":1, "Dos":2, "One":1, "Two": 2}
>>> list(iter(c))
['Uns', 'Dos', 'One', 'Two']
>>> max(c, key=c.get)
'Dos'
>>> c = {"One":1, "Two":2, "Uns":1, "Dos": 2}
>>> list(iter(c))
['One', 'Two', 'Uns', 'Dos']
>>> max(c, key=c.get)
'Two'

在python3.5中,哪个最大值是第一个遇到的是任意的,但是它将是第一个具有最大值的键,如list(iter(c))

在python2.7中,我上面引用的max()函数的行为没有在文档中指定,所以谁知道呢。你知道吗


至于你的第二个例子,它真的没有意义,所以我就匆匆过去:c.get()将返回None当你传递一个字典中不存在的键。在Python2.x中,允许使用max()用来确定最大值的<运算符将NoneNone进行比较;我猜,因为它比较了两个相同的对象,它们被认为是相等的,因此比较的结果是False,并且您案例中的每一项都被认为是“最大值”。由于在python2.x中键的顺序是未指定的,而且max()返回的键的顺序也是未指定的,因此得到的结果基本上是任意的。这不重要,因为整件事毫无意义。你知道吗

您可以通过避免使用dict.get()和编写更多断言代码来防止这种情况,因为访问字典中不存在的键显然是一个错误,因此会提前失败:

max(c, key=lambda k: c[k])

不要把字典的键和“键函数”混淆了

当两个值相同时,maxmin将返回第一个匹配的键。因为dict的迭代在Python3.6之前是无序的,所以依赖于返回哪个键不是一个好主意

在上一个示例中,您要求dict将这些值用作dict的键。这通常会返回None,除非该值恰好也是键(例如,如果所有键都是str,并且所有值都是int,则永远不会发生这种情况)。在Python2中,由于None不大于None,因此遇到的第一个键将是最终返回的键。在Python3中,执行此比较会引发异常。你知道吗

相关问题 更多 >

    热门问题