มีหลายวิธีในการจัดเรียงองค์ประกอบใน python แต่วันนี้เราจะมาดูการเรียงลำดับประเภทข้อมูลใน python โดยใช้operator.itemgetterและoperator.attrgetter
1. ทำความเข้าใจกับoperator.itemgetter(attribute) หรือoperator.itemgetter(*attribute)
ส่งคืนวัตถุที่สามารถเรียกได้ซึ่งดึงรายการจากตัวถูกดำเนินการ __getitem__()
ฉัน. การใช้ itemgetter ในพจนานุกรมเพื่อดึงข้อมูลคู่คีย์-ค่า
from operator import itemgetter itemgetter('car_name')({'car_name':'x4','company':'BMW'}) output: 'x4'
ครั้งที่สอง การใช้ itemgetter เพื่อดึงองค์ประกอบของรายการ
itemgetter(2)([1,2,3,4,5]) output: 3
2. ทำความเข้าใจกับoperator.attrgetter(attribute) หรือoperator.attrgetter(*attribute)
ส่งคืนวัตถุที่เรียกได้ซึ่งดึงคุณลักษณะจากตัวถูกดำเนินการ
from operator import attrgetter class Movie: def __init__(self,name,date): self.name = name self.date = date movie = Movie('TheDarkKnight',"2012")
การดึงข้อมูลชื่อและแอตทริบิวต์ (ชื่อและวันที่) ของวัตถุภาพยนตร์
attrgetter('name')(movie) Output: 'TheDarkKnight' attrgetter('name','date')(movie) Output: ('TheDarkKnight', '2012')
3. การใช้ฟังก์ชันเหล่านี้ในการเรียงลำดับ
ด้านล่างนี้คือภาพยนตร์ของ Marvel ที่เข้าฉายในเดือนเมษายน และเราต้องการจัดเรียงตามวันที่และชื่อที่เราสามารถใช้ itemgetter
movies = [{'name':'Avengers Endgame','date':'26/4/2019'}, {'name':'Iron Man 3','date':'26/4/2013'}, {'name':'Avengers: Age of Ultron','date':'24/4/2013'} ]
จัดเรียงตาม 'ชื่อ'
sorted(movies, key=itemgetter('name')) #equivalent to "sorted(movies, key = lambda x: x['name'])" Output:[{'name': 'Avengers Endgame', 'date': '26/4/2019'}, {'name': 'Avengers: Age of Ultron', 'date': '24/4/2013'}, {'name': 'Iron Man 3', 'date': '26/4/2013'}]
จัดเรียงตาม 'วันที่'
sorted(movies, key=itemgetter('date')) #equivalent to "sorted(movies, key = lambda x: x['date'])" Output: [{'name': 'Avengers: Age of Ultron', 'date': '24/4/2013'}, {'name': 'Iron Man 3', 'date': '26/4/2013'}, {'name': 'Avengers Endgame', 'date': '26/4/2019'}]
จัดเรียงตาม 'ชื่อ' และ 'วันที่' ที่เทียบเท่า
sorted(movies ,key = itemgetter('name','date')) #equivalent to "sorted(movies, key = lambda x: (x['name],x['date']))" [{'name': 'Avengers Endgame', 'date': '26/4/2019'}, {'name': 'Avengers: Age of Ultron', 'date': '24/4/2013'}, {'name': 'Iron Man 3', 'date': '26/4/2013'}]
อย่างที่เราเห็นทั้ง lambda และ itemgetter มีฟังก์ชันการทำงานเหมือนกัน แต่ itemgetter นั้นเร็วกว่า lambda เล็กน้อย ดังนั้นเมื่อความเร็วในการดำเนินการและหน่วยความจำเป็นปัญหาitemgetter em>ขอแนะนำ
4. การใช้attrgetter สำหรับการเรียงลำดับวัตถุ
ตัวอย่างเช่น คุณมีวัตถุที่ต้องจัดเรียงตามคุณลักษณะอย่างใดอย่างหนึ่ง แต่ใน python ไม่มีทางที่เราจะทำเช่นนี้ได้ ณ จุดนี้ attrgetter เข้ามาช่วยเหลือ เรามาต่อด้วยตัวอย่างเดียวกันกับข้างบน
class Movie: def __init__(self,movie_name,movie_date): self.movie_name = movie_name self.movie_date = movie_date def __repr__(self): return 'Movie({},{})'.format(self.movie_name,self.movie_date) movies = [Movie('Avengers Endgame','26/4/2019'),Movie('Iron Man 3','26/4/2013'), Movie('Avengers: Age of Ultron','24/4/2013')]
ตอนนี้เรามาจัดเรียงวัตถุภาพยนตร์ตามวันที่ออกฉายกันดีกว่า
sorted(movies,key=attrgetter('movie_date')) # equavilent to sorted(movies, key= lambda x : x.movie_date) Output: [Movie(Avengers: Age of Ultron,24/4/2013), Movie(Iron Man 3,26/4/2013), Movie(Avengers Endgame,26/4/2019)]