dic = {'a':4, 'b':5, 'cd':5 }
我正在努力寻找:
- 最高值(首先搜索最高值=>
b
,cd
) - 最长关键字(然后搜索最长关键字=>
'cd'
)
我使用以下代码:
max_val = dic[max(dic, key=dic.get)]
maxDicVal = dict(filter(lambda x: x[1] == max_val, dic.items()))
maxDicKey = max(maxDicVal, key=len)
有没有更好的方法来实现这一点?
谢谢。
然后,您可以根据值降序和键的长度降序对字典项进行排序。例如:
items = sorted(dic.items(), key=lambda v:(v[1], len(v[0])), reverse=True)
输出:
[('cd', 5), ('b', 5), ('a', 4)]
则maxDicKey
是items[0][0]
,即cd
有了很大的改进
我们真的应该尝试一次完成所有事情。缺点是有更多的代码。下面将dic
中的第一个密钥存储在cur
中,然后从第二个密钥开始迭代dic
,如果我们找到一个大于与密钥cur
相关联的值的值,或者如果我们找到了一个值等于与密钥cur
相关联的数值并且密钥的长度大于cur
的长度的密钥、值对,则更新cur
。
it = iter(dic)
cur = next(it) # the first key
for key in it: # iterate thr keys of dic, starting from second
if dic[key] > dic[cur] or (dic[key] == dic[cur] and len(key) > len(cur)):
cur = key
print(cur)
较小的改进
max_value = max(dic.values())
a = max((k for k in dic if dic[k] == max_value), key = len)
CCD_ 14是在CCD_ 15中产生密钥的生成器,使得其值等于最大值。CCD_ 16然后在这些密钥中选择最大的字符串。
上面的比这一行快,因为上面的缓存max(dic.values())
:
a = max((k for k in dic if dic[k] == max(dic.values())), key = len)
计时
# EBDS
1.19 µs ± 3.26 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
# oda (a smaller improvement)
759 ns ± 4.12 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
# oda (a big improvement)
304 ns ± 0.953 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
# Nick
648 ns ± 1.36 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)