gpt4 book ai didi

python - 将 max 与 'get' 方法一起用于字典

转载 作者:行者123 更新时间:2023-12-01 01:38:05 25 4
gpt4 key购买 nike

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

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(c, key=c.get)

max函数内部迭代第一个参数;对于字典,这将按某种顺序迭代字典的,这就是事情变得棘手的地方。

  • 在 Python 3.6 之前,这个顺序是任意的,不保证是任何特定的顺序
  • 在 Python 3.6 的 CPython 实现中,作为实现细节,顺序已更改为键插入字典的顺序。 (在您的情况下,它们以文字形式写入的顺序,因此 "One""Two""Uns""Dos"
  • 自 Python 3.7 起,此行为由语言规范保证。

(另请参阅 Python documentation on the dict type。)

现在我们知道 max()函数将看到映射到最大值 "Two" 的两个可能的键和"Dos" ,按此顺序。 documentation for the max() 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'

在 Python 3.5 中,第一个遇到的最大值是任意的,但它将是 list(iter(c)) 中出现的第一个具有最大值的键。

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

<小时/>

至于你的第二个例子,它确实没有意义,所以我就直接跳过它:c.get()将返回None当你向它传递一个字典中不存在的键时。在Python 2.x中,允许比较NoneNone使用<运算符 max()用于确定最大值;我猜测,因为它比较两个相同的对象,所以它们被认为是相等的,因此比较的结果是 False ,并且您案例中的每个项目都将被视为“最大值”。由于 Python 2.x 中未指定键的顺序,并且 max() 返回哪一个也没有指定。 ,你得到的结果本质上是任意的。这并不重要,因为整个事情没有任何意义。

您可以通过避免使用dict.get()来防止这种情况发生。 ,并且编写更果断的代码,但会提前失败,因为很明显,访问字典中不存在的键是一个错误:

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

关于python - 将 max 与 'get' 方法一起用于字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52192934/

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