python:itemgetter()函数,实例应用:对元组列表,字典进行排序

1  定义

operator.itemgetter(item)
operator.itemgetter(*items)

说明:

1.1  使用操作数的__getitem__()方法取得实例对象对应的数据项,并返回一个可调用对象;

1.2  如果要取回多个数据项,该可调用对象返回数据项的元组。

from operator import itemgetter

ls = [1, 2, 3, 4]
g = itemgetter(0)
print(g(ls))  # 1
f = itemgetter(3, 0, 1)
print(f(ls))  # (4,1,2)

这个函数的使用效果等价于:

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

2  函数的参数

2.1  任何拥有__getitem__()类的对象,均可使用这个函数

2.2  字典类型,可使用任意可哈希的值(比如:数值、字符串、实现了__hash__方法的自定义类、元组)

2.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'

tips:这里的切片,可以使用命名切片,参考这篇文章:01-列表操作-使用slice()命名切片,增强程序可读及可维护性,兼使用indices()方法,防止出现序列访问异常-CSDN博客

实例1:取得元组列表中特定的区域值/对元组列表排序

from operator import itemgetter

inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
getcount = itemgetter(1)

print(list(map(getcount, inventory)))
# 返回:[3, 2, 5, 1]

print(sorted(inventory, key=getcount))
# 返回:[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]

实例2:对字典/字典列表排序

1 利用zip()函数对字典内元素进行排序

from operator import itemgetter

height = {'lili':132,'lucy':180,'vivian':150,'elen':170,'Alice':175}

height_ordered = sorted(zip(height.values(),height.keys()))
print(height_ordered)

2  利用itemgetter对字典列表进行排序

persons = [
    {'name': 'joe', 'height': 170, 'salary': 3200, 'dept': 1},
    {'name': 'alen', 'height': 130, 'salary': 8200, 'dept': 5},
    {'name': 'chary', 'height': 163, 'salary': 5200, 'dept': 3},
    {'name': 'x-man', 'height': 130, 'salary': 4200, 'dept': 2},
    {'name': 'bob', 'height': 180, 'salary': 7200, 'dept': 5},
    {'name': 'god', 'height': 140, 'salary': 2200, 'dept': 3}
]

sort_by_dept = sorted(persons, key=itemgetter('dept'))
print(sort_by_dept)

sort_by_salary_dept = sorted(persons,key=itemgetter('salary','dept'))
print(sort_by_salary_dept)

第1个返回(按部门排序):

[{'name': 'joe', 'height': 170, 'salary': 2200, 'dept': 1},

{'name': 'x-man', 'height': 130, 'salary': 2200, 'dept': 2},

{'name': 'chary', 'height': 163, 'salary': 5200, 'dept': 3},

{'name': 'god', 'height': 140, 'salary': 2200, 'dept': 3},

{'name': 'alen', 'height': 130, 'salary': 8200, 'dept': 5},

{'name': 'bob', 'height': 180, 'salary': 7200, 'dept': 5}]

第2个返回(按工资和部门排序,先按工资,再按部门):
[{'name': 'joe', 'height': 170, 'salary': 2200, 'dept': 1},

{'name': 'x-man', 'height': 130, 'salary': 2200, 'dept': 2},

{'name': 'god', 'height': 140, 'salary': 2200, 'dept': 3},

{'name': 'chary', 'height': 163, 'salary': 5200, 'dept': 3},

{'name': 'bob', 'height': 180, 'salary': 7200, 'dept': 5},

{'name': 'alen', 'height': 130, 'salary': 8200, 'dept': 5}]

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值