6

我需要找到其值在有序字典中最低的键,但只有当它在 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

4 回答 4

24

您可以使用itertools.compresswith key to minbeget方法,

>>> from itertools import compress
>>> min(compress(my_lookup, my_list), key=my_lookup.get)
a
于 2013-07-14T09:57:01.053 回答
3

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

>>> min(((value, key) for ((key, value), flag) in zip(my_lookup.iteritems(), my_list) if flag))[1]
'a'
于 2013-07-14T10:07:08.417 回答
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)
于 2013-07-14T16:21:18.093 回答
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 的解决方案更快,也更短。

于 2013-07-14T14:04:12.980 回答