对字典列表进行操作
比如我们要根据字典的某个key值进行排序
一般方法应该是使用一些排序方法进行的,比如冒泡排序,就是挨个进行比较满足条件就交换位置
persons = [
{'name':'张三','age':18,'score':80},
{'name':'李四','age':17,'score':70},
{'name':'王五','age':18,'score':89},
{'name':'马六','age':20,'score':100},
{'name':'赵七','age':19,'score':60},
]
# 这里我就没有做过多的优化了,大家可以去尝试优化优化一下,也就是减小比较次数
for i in range(len(persons)-1):
for j in range(len(persons)-1-i):
if persons[j]['age']>persons[j+1]['age']:
persons[j],persons[j+1] = persons[j+1],persons[j]
print(persons)
# [{'name': '李四', 'age': 17, 'score': 70}, {'name': '张三', 'age': 18, 'score': 80}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '赵七', 'age': 19, 'score': 60}, {'name': '马六', 'age': 20, 'score': 100}]
这里我们就可以想一下,都是列表,使用sort()方法可不可以呢?
答案当然是可以的,注意这里涉及到匿名函数的使用
# 都是操作的上面那个列表这里我就不再写了
# 注意些操作完一个就注释一个
# 这里我们需要用到key关键字
# 根据age对它们进行排序
# 这是列表的sort方法,会改变原来列表的数据,而不是返回一个新列表
# persons.sort(key=lambda p:p['age'])
# print(persons)
# [{'name': '李四', 'age': 17, 'score': 70}, {'name': '张三', 'age': 18, 'score': 80}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '赵七', 'age': 19, 'score': 60}, {'name': '马六', 'age': 20, 'score': 100}]
# sorted函数则是返回一个新的列表,这里我就直接打印了
# 这是根据score进行排序的
# print(sorted(persons,key=lambda a:a['score']))
# [{'name': '赵七', 'age': 19, 'score': 60}, {'name': '李四', 'age': 17, 'score': 70}, {'name': '张三', 'age': 18, 'score': 80}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '马六', 'age': 20, 'score': 100}]
# 根据多个字段进行排序,哪个写在前就以哪个为主
# print(sorted(persons,key=lambda s:(s['age'],s['score'])))
# [{'name': '李四', 'age': 17, 'score': 70}, {'name': '张三', 'age': 18, 'score': 80}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '赵七', 'age': 19, 'score': 60}, {'name': '马六', 'age': 20, 'score': 100}]
# 这里没发生什么改变是因为age重复的少,大家在做测试的时候可以多给一点数据,这样就可以更为清楚的观察
了解:其实key关键字后面也可以跟itemgetter()函数,作用和匿名函数一样但是itemgetter()函数的运行效率要高一点,这里需要导入一个模块
from operator import itemgetter
# print(sorted(persons,key=itemgetter('age')))
# [{'name': '李四', 'age': 17, 'score': 70}, {'name': '张三', 'age': 18, 'score': 80}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '赵七', 'age': 19, 'score': 60}, {'name': '马六', 'age': 20, 'score': 100}]
# print(sorted(persons,key=itemgetter('age','score')))
# [{'name': '李四', 'age': 17, 'score': 70}, {'name': '张三', 'age': 18, 'score': 80}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '赵七', 'age': 19, 'score': 60}, {'name': '马六', 'age': 20, 'score': 100}]
max(),min()函数也是支持上述操作的
from operator import itemgetter
fruits = [
{'name':'梨','price':5},
{'name':'苹果','price':4.5},
{'name':'车厘子','price':20},
{'name':'香蕉','price':6},
{'name':'火龙果','price':10},
]
# 求价格最高的水果
# 生成器表达式和列表推导式就只能求出最高的价格
print(max(s['price'] for s in fruits))# 20
print(max(fruits,key= lambda s:s['price']))
# {'name': '车厘子', 'price': 20}
print(min(fruits,key=itemgetter('price')))
# {'name': '苹果', 'price': 4.5}
对类对象列表进行操作
这里也可以使用key关键字,还可以使用operator模块里的attrgetter()方法
from operator import attrgetter
class Person:
def __init__(self,age):
self.age = age
def __repr__(self):# 打印类对象时格式
return f'User({self.age})'
persons = [Person(10),Person(20),Person(15)]
# persons.sort(key=lambda p:p.age)
# print(persons)# [Person(10), Person(15), Person(20)]
print(sorted(persons,key=attrgetter('age')))# [Person(10), Person(15), Person(20)]
print(max(persons,key=attrgetter('age')))# Person(20)
print(min(persons,key=attrgetter('age')))# Person(10)