2015-06-21 77 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