operator.itemgetter()与sorted()的结合使用

本文详细介绍了Python中operator模块的itemgetter方法,演示了如何使用它来获取列表、字典和对象中的特定元素,特别是在排序和过滤场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

operator模块下有很多方法,这里主要介绍itemgetter,该方法的解释为:

Return a callable object that fetches the given item(s) from its operand.
After f = itemgetter(2), the call f(r) returns r[2].
After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])

即该方法返回一个可调用对象,该对象从其操作的数据中获取给定项,如果选择了多项,返回这些项组成的元组,该对象是通过__getitem__的方法,从被操作的数中获取item的。
在实际使用中可以认为返回的是一个函数,可以与filter()reduce()结合使用。

使用时先导入模块

import operator

使用方法举例:

a = [1, "qwe", 3, 4]
# 定义b,获取从对象中获取下标为1和2的元素
b = operator.itemgetter(1, 2)
print(type(b))  # <class 'operator.itemgetter'>
print(b(a))  # ('qwe', 3)
print(type(b(a)))  # <class 'tuple'>

sorted()函数结合使用

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

# 按照第三个数据进行比较,使用匿名函数lambda
c = sorted(students, key=lambda student: student[2])
print(c)  # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

# 使用operator.itemgetter
d = sorted(students, key=operator.itemgetter(2))
print(d)  # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
# 根据第二个元素排序,一样则根据第三个元素排序
e = sorted(students, key=operator.itemgetter(1, 2))
print(e)  # [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

对字典进行排序

f = {1: 2, 3: 5, 2: 4, 0: 0, 7: 1, 5: 1, 6: 1}

# 使用匿名函数,只能根据某一个元素进行排序
g = sorted(f.items(), key=lambda x: x[1])
print(g)  # [(0, 0), (7, 1), (5, 1), (6, 1), (1, 2), (2, 4), (3, 5)]

# 使用operator,操作数为1表示根据值排序,为0表示根据键排序,也可以一起用
h = sorted(f.items(), key=operator.itemgetter(1, 0))
print(h)  # [(0, 0), (5, 1), (6, 1), (7, 1), (1, 2), (2, 4), (3, 5)]

对包含字典的列表进行排序

i = [{"name": "Homer", "age": 39}, {"name": "Bert", "age": 10}, {"name": "Tom", "age": 18}, {"name": "Bob", "age": 18}]

# 使用匿名函数,根据姓名进行排序
j = sorted(i, key=lambda x: x["name"])
print(j)

# 使用operator,根据姓名进行排序
k = sorted(i, key=operator.itemgetter("name"))
print(k)
# 根据年龄排序,年龄相同则根据姓名排序
l = sorted(i, key=operator.itemgetter("age", "name"))
print(l)  # [{'name': 'Bert', 'age': 10}, {'name': 'Bob', 'age': 18}, {'name': 'Tom', 'age': 18}, {'name': 'Homer', 'age': 39}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值