มีหลายวิธีในการจัดเรียงองค์ประกอบใน 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)]

อ้างอิง: Jones, D., 2013 Python Cookbook, ฉบับพิมพ์ครั้งที่ 3 O'Reilly Media, Inc.