2015-06-21 39 views
7

我经常写代码,如:平凡函子

sorted(some_dict.items(), key=lambda x: x[1]) 
sorted(list_of_dicts, key=lambda x: x['age']) 
map(lambda x: x.name, rows) 

,我还想写

def attr_f(field): 
    return lambda x: getattr(x, field) 

def idx_f(field): 
    return lambda x: x[field] 

是否有仿创作者一样idx_f和attr_f在Python中,并且它们在使用时比lambda更清晰?

回答

11

operator模块具有operator.attrgetter()operator.itemgetter()是做到这一点:

from operator import attrgetter, itemgetter 

sorted(some_dict.items(), key=itemgetter(1)) 
sorted(list_of_dicts, key=itemgetter('name')) 
map(attrgetter('name'), rows) 

这些功能也采取不止一个的说法,在这一点上,他们会返回一个包含每个参数的值的元组:

# sorting on value first, then on key 
sorted(some_dict.items(), key=itemgetter(1, 0)) 

# sort dictionaries by last name, then first name 
sorted(list_of_dicts, key=itemgetter('last_name', 'first_name')) 

attrgetter()功能也接受带点名称,在那里你可以达到属性的属性:

# extract contact names 
map(attrgetter('contact.name'), companies) 
+0

太棒了!我记得使用这些方式,但无法在Google上找到它们。 – Herbert