找到非零值字典中最大键的有效方法

cla*_*ark 6 python dictionary

我是新的Python,并试图以更加Pythonic和高效的方式实现代码.给定带有数字键和值的字典,找到具有非零值的最大键的最佳方法是什么?

谢谢

Nic*_*ley 13

这样的事情应该相当快:

>>> x = {0: 5, 1: 7, 2: 0}
>>> max(k for k, v in x.iteritems() if v != 0)
1
Run Code Online (Sandbox Code Playgroud)

(删除它!= 0会稍快一些,但在某种程度上模糊了意思.)

  • 请注意,在Python 3.x` .iteritems`中不再存在,`.items`返回迭代器.(与Python 2.x不同,`.items`返回一个列表,`.iteritems`返回一个迭代器.) (7认同)
  • 这里发生了什么?我们调用max()来查找最大的键.我们传递给max()的是"生成器表达式",非常类似于"列表理解".max()将重复获取k的值,并且它将选择最大值.当v值不为零时,生成器表达式仅返回k值.k和v值来自x.iteritems(),它返回键值对.这段代码适用于Python 2.4及更高版本,但正如Stephan202所述,对于Python 3.x,您需要将"iteritems"替换为"items". (3认同)
  • 由于OP是新的,因此对正在发生的事情的描述可能也会有所帮助. (2认同)

Cor*_*erg 10

要获得最大的密钥,您可以使用该max功能并检查如下所示的密钥:

max(x.iterkeys())
Run Code Online (Sandbox Code Playgroud)

要筛选出值为0的值,可以使用生成器表达式:

(k for k, v in x.iteritems() if v != 0)
Run Code Online (Sandbox Code Playgroud)

您可以将这些结合起来以获得您要查找的内容(因为max只需要一个参数,可以删除生成器表达式周围的括号):

max(k for k, v in x.iteritems() if v != 0)
Run Code Online (Sandbox Code Playgroud)

  • 差不多了!最后,删除方括号,您将获得最佳解决方案.方括号构成列表理解,构建整个列表,然后将整个列表传递给max().抛开方形括号,您将获得一个生成器表达式,它将值一次传递给max().对于少量项目来说,这没什么大不了的,但是对于非常大的词典,构建列表然后销毁它的额外努力可能是相当大的. (2认同)
  • 仅供参考,你不需要额外的parens.max()的parens可以执行双重任务:它们可以是函数调用max()的parens,它们也可以是生成器表达式周围的parens.试试吧!:-) (2认同)