在OrderedDict中查找具有最小值的键

时间:2013-07-14 09:55:03

标签: python dictionary

我需要找到其值在有序字典中最低的键,但只有当my_list中的位置为True时才会找到。

from collections import OrderedDict

my_list = [True,False,False,True,True,False,False,False,]

my_lookup = OrderedDict([('a', 2), ('b', 9), ('c', 4), ('d', 7),  
                         ('e', 3), ('f', 0), ('g', -5), ('h', 9)])

我知道如何使用像

这样的for循环来完成它
mins=[]
i=0
for item in my_lookup.items():
    if my_list[i]:
        mins.append(item)
    i+=1
print min(mins,key=lambda x:x[1])[0]

打印

a

因为a在my_list中最低也是True。

这有效,但很长,我想知道怎么用理解或一行来做?

4 个答案:

答案 0 :(得分:24)

您可以itertools.compress使用密钥min get方法,

>>> from itertools import compress
>>> min(compress(my_lookup, my_list), key=my_lookup.get)
a

答案 1 :(得分:3)

您还可以组合生成器表达式和min

>>> min(((value, key) for ((key, value), flag) in zip(my_lookup.iteritems(), my_list) if flag))[1]
'a'

答案 2 :(得分:2)

两衬垫:

from itertools import izip
print min((lookup_key for (lookup_key, keep) in izip(my_lookup.iterkeys(),
            my_list) if keep), key=my_lookup.get)

答案 3 :(得分:1)

对于它的价值,原始代码的略微变化合理地执行(与ovgolovin的方法相同)并且非常易读:

minimum = (None, float('inf'))
for i, item in enumerate(my_lookup.items()):
    if not my_list[i]:
        continue
    if item[1] < minimum[1]:
        minimum = item
return minimum[0]

基于ovgolovin的ideone基准测试,即使原始代码也只比这稍微慢一些。当然,Jared的解决方案更快,更短。