所以,我看了这个演示,它向我介绍了一种在字典中找到最大值的方法。这对这里的大多数人来说可能没有任何突破,但事实是:
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”?请解开这个灵魂!你知道吗
当你打电话时:
max
函数在内部迭代第一个参数;对于字典,它将迭代字典的键。。。一些秩序,这是事情变得毛茸茸的地方。你知道吗"One"
,"Two"
,"Uns"
,"Dos"
(另请参见Python documentation on the ^{} type 。)
现在我们知道} function 表示:
max()
函数将看到两个可能的键,它们依次映射到最大值"Two"
和"Dos"
。documentation for the ^{因此,在Python 3.7和CPython 3.6中,返回的内容取决于键插入字典的顺序:
在python3.5中,哪个最大值是第一个遇到的是任意的,但是它将是第一个具有最大值的键,如
list(iter(c))
在python2.7中,我上面引用的
max()
函数的行为没有在文档中指定,所以谁知道呢。你知道吗至于你的第二个例子,它真的没有意义,所以我就匆匆过去:
c.get()
将返回None
当你传递一个字典中不存在的键。在Python2.x中,允许使用max()
用来确定最大值的<
运算符将None
与None
进行比较;我猜,因为它比较了两个相同的对象,它们被认为是相等的,因此比较的结果是False
,并且您案例中的每一项都被认为是“最大值”。由于在python2.x中键的顺序是未指定的,而且max()
返回的键的顺序也是未指定的,因此得到的结果基本上是任意的。这不重要,因为整件事毫无意义。你知道吗您可以通过避免使用
dict.get()
和编写更多断言代码来防止这种情况,因为访问字典中不存在的键显然是一个错误,因此会提前失败:不要把字典的键和“键函数”混淆了
当两个值相同时,
max
或min
将返回第一个匹配的键。因为dict的迭代在Python3.6之前是无序的,所以依赖于返回哪个键不是一个好主意在上一个示例中,您要求dict将这些值用作dict的键。这通常会返回
None
,除非该值恰好也是键(例如,如果所有键都是str,并且所有值都是int,则永远不会发生这种情况)。在Python2中,由于None
不大于None
,因此遇到的第一个键将是最终返回的键。在Python3中,执行此比较会引发异常。你知道吗相关问题 更多 >
编程相关推荐