operator.attrgetter與operator.itemgetter的用法
operator.itemgetter()的用法
通過公共建對字典列表排序:
import operator
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
# 通過公共建對字典序列進行排序
rows_by_fname = sorted(rows, key=operator.itemgetter('fname')) # itengetter()方法直接接受字典的key做參數
rows_by_uid = sorted(rows, key=operator.itemgetter('uid'))
rows_by_fname
Out[3]:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
rows_by_uid
Out[4]:
[{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
# operator.itemgetter()函數可以接受多個鍵
rows_by_lfname = sorted(rows, key=operator.itemgetter('lname', 'fname'))
rows_by_lfname
Out[6]:
[{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}]
也可使用lambda表達式:
rows_by_fname = sorted(rows, key=lambda r: r['fname']) # r爲rows序列中元素
rows_by_lname = sorted(rows, key=lambda r: (r['lname'], r['fname'])) # 傳入元組
rows_by_fname
Out[9]:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
rows_by_lfname
Out[10]:
[{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}]
operator.attrgetter()的使用
對不原生支持比較操作的對象排序:
描述: 對同一個類實例間做排序,但是它們不原生支持比較操作
class User:
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return 'User({})'.format(self.user_id)
users = [User(23), User(3), User(12)]
users
Out[12]: [User(23), User(3), User(12)]
# 第一種解法,lambda表達式
sorted(users, key=lambda u: u.user_id)
Out[13]: [User(3), User(12), User(23)]
# 第二種解法,operator.attrgetter()
sorted(users, key=operator.attrgetter('user_id')) # 直接傳入user_id, operator.attrgetter()函數返回一個可調用對象傳給key參數
Out[14]: [User(3), User(12), User(23)]
總結
1、operator.attrgetter()用法同 operator.itemgetter(), 也可以接受參數元組;
2、operator.attrgetter()運行效率比lambda表達式要高;
3、operator.attrgetter() 接受屬性形式的參數。