對字典串列進行操作
比如我們要根據字典的某個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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250695.html
標籤:python
上一篇:通過爬蟲實作CSDN自動點贊
下一篇:解決已利用pip安裝plotly庫但運行仍顯示ImportError: No module named ‘plotly‘方法(附帶模擬擲骰子代碼)
