天天看點

Python--operator庫中的attrgetter()和itemgetter()

  • operator.attrgetter()

  1. 傳回:傳回從其操作數擷取attr的可調用對象。如果請求多個屬性,則傳回屬性元組。
  2. attrgetter()實作代碼:官方标準庫3.7
    def attrgetter(*items):
        if any(not isinstance(item, str) for item in items):
            raise TypeError('attribute name must be a string')
        if len(items) == 1:
            attr = items[0]
            def g(obj):
                return resolve_attr(obj, attr)
        else:
            def g(obj):
                return tuple(resolve_attr(obj, attr) for attr in items)
        return g
    
    def resolve_attr(obj, attr):
        for name in attr.split("."):
            obj = getattr(obj, name)
        return obj
               
  3. 示例:
    class Teacher():
        def __init__(self, name, salary, age):
            self.name = name
            self.age  = age
            self.salary = salary
        def __repr__(self):
            return  repr((self.name,self.age,self.salary))
    
    teachers = [
    Teacher("A",1200,30),
    Teacher("B",1200,31),
    Teacher("C",1300,30)
    ]
    
    from operator import attrgetter
    print(sorted(teachers,key=attrgetter("age")))  # 根據age排序
    print(sorted(teachers,key=attrgetter("salary","age")))   # 根據salary和age排序
    
    結果:
    [('A', 30, 1200), ('C', 30, 1300), ('B', 31, 1200)]
    [('A', 30, 1200), ('B', 31, 1200), ('C', 30, 1300)]
               
  •  operator.itemgetter()

  1. 傳回一個可調用對象,該對象使用操作數的__getitem __()方法從其操作數中擷取項。如果指定了多個項,則傳回一個查找值元組。      
  2. itemgetter()實作代碼:官方标準庫3.7
    def itemgetter(*items):
        if len(items) == 1:
            item = items[0]
            def g(obj):
                return obj[item]
        else:
            def g(obj):
                return tuple(obj[item] for item in items)
        return g
               
  3.  示例:
    >>> itemgetter(1)('ABCDEFG')
    'B'
    >>> itemgetter(1,3,5)('ABCDEFG')
    ('B', 'D', 'F')
    >>> itemgetter(slice(2,None))('ABCDEFG')
    'CDEFG'
    >>> soldier = dict(rank='captain', name='dotterbart')
    >>> itemgetter('rank')(soldier)
    'captain'
    
    >>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
    >>> getcount = itemgetter(1)
    >>> list(map(getcount, inventory))
    [3, 2, 5, 1]
    >>> sorted(inventory, key=getcount)
    [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]