我有以下词典列表,
test = [{'a':100, 'b':1, 'd':3.2},
{'a':200, 'b':5, 'd':8.75},
{'a':500, 'b':2, 'd':6.67},
{'a':150, 'b':7, 'd':3.86},
{'a':425, 'b':2, 'd':7.72},
{'a':424, 'b':2, 'd':7.72}]
给定一个'b'值,我需要找到'd'的最大值并在该字典中提取相应的'a'值。如果有平局,则取最高值“ a”。例如{a:424,b:2,d:7.72}和{a:424,b:2,d:7.72}的b = 2,并且它们对应的d值相等。在这种情况下,我返回a = 425。
以下代码可以正常运行。但是,我想知道优化此方法或使用匿名函数(lambda)解决此问题的可能方法。
def gerMaxA(bValue):
temporary_d = -999.99
temporary_a = 0
for i in test:
if i['b'] == bValue:
if i['d'] > temporary_d:
temporary_a = i['a']
temporary_d = i['d']
elif i['d'] == temporary_d:
if i['a'] >= temporary_a:
temporary_a = i['a']
ans = (temporary_a, temporary_d)
return ans
赞赏任何见解。
但是,我想知道优化此方法或使用匿名函数(lambda)解决此问题的可能方法。
“优化”是一个红色的鲱鱼-您不能简单地在空隙中简单地“优化”某些东西,必须针对某种质量(速度,内存使用率等)对其进行优化。
相反,我将展示如何使代码更简单,更优雅。从理论上讲,这对于Stack Overflow来说是题外话,但是IMX,如果我尝试将人员发送到其他地方,该系统将无法很好地工作。
给定“ b”值
这意味着我们将选择满足条件的列表元素(即,'b'
值与目标匹配)。另一个说法是过滤; 而Python确实有一个内置的filter
功能,它通常是更清洁和更Python使用理解或产生表达用于这一目的。由于我们将对结果进行进一步处理,因此我们不应该选择。
我需要找到“ d”的最大值
更准确地说:您看到的元素具有的最大值'd'
。或者,就像我们想在Python世界中想到的那样,最大元素由为主键 'd'
。这是使用max
函数内置的。由于我们将数据直接馈送到该函数,因此我们不需要构建容器,因此我们将为第一步选择一个生成器表达式。
第一步看起来像这样,从左到右依次是:
(element for element in test if element['b'] == b_value)
“A发生器(()
)产生:所述element
,for
每个element
FOUND in test
,但仅包括它if
的element
的['b']
值是== b_value
”。
在第二步中,我们将max
调用包装起来,并提供适当的key
功能。实际上,这是我们可以使用的位置lambda
:
max(
(element for element in test if element['b'] == b_value),
key=lambda element:(element['d'], element['a'])
)
这lambda
是将给定element
值转换为该对值的函数;max
然后将根据lambda
每个值产生的值比较过滤后的dict 。
或者,我们可以使用命名函数-lambda是同一件事,只是没有名称,并且对其内可以执行的操作有限制:
def my_key(element):
return element['d'], element['a']
# and then we do
max((element for element in test if element['b'] == b_value), key=my_key)
或者我们可以使用标准库:
from operator import itemgetter
max((element for element in test if element['b'] == b_value), key=itemgetter('d', 'a'))
当然,最后一步只是['a']
从max
结果中提取值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句