我需要找到其值在有序字典中最低的键,但只有当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。
这有效,但很长,我想知道怎么用理解或一行来做?
答案 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的解决方案更快,更短。