ปัญหา
คุณต้องการคำนวณต่างๆ (เช่น ค่าต่ำสุด ค่าสูงสุด การเรียงลำดับ ฯลฯ) ในพจนานุกรมของข้อมูล
วิธีแก้ปัญหา
เราจะสร้างพจนานุกรมที่มีผู้เล่นเทนนิสและชื่อแกรนด์สแลมของพวกเขา
PlayerTitles = { 'Federer': 20, 'Nadal': 20, 'Djokovic': 17, 'Murray': 3, 'Theim' : 1, 'Zverev': 0 }
1. เรามีพจนานุกรมพร้อมชื่อผู้เล่นและชื่อแกรนด์สแลมที่ผู้เล่นแต่ละคนชนะ ตอนนี้ให้เราพยายามหาผู้เล่นที่มีจำนวนชื่อน้อยที่สุด
#type(PlayerTitles) print(f"Output \n*** The minimum value in the dictionary is {min(PlayerTitles)} ")
ผลลัพธ์
*** The minimum value in the dictionary is Djokovic
2 นี่อาจไม่ใช่สิ่งที่เราต้องการเพราะเรากำลังพยายามคำนวณเกี่ยวกับค่าพจนานุกรม ให้เราลองแก้ไขโดยใช้วิธี values() ของพจนานุกรม
print(f"Output \n*** The minimum value in the dictionary is {min(PlayerTitles.values())} ")
ผลลัพธ์
*** The minimum value in the dictionary is 0
3. น่าเสียดายที่สิ่งนี้มักไม่ใช่สิ่งที่คุณต้องการ ตัวอย่างเช่น คุณอาจต้องการทราบข้อมูลเกี่ยวกับคีย์ที่เกี่ยวข้อง เช่น ชื่อผู้เล่นที่มีจำนวนชื่อน้อยที่สุด
4. คุณสามารถรับคีย์ที่สอดคล้องกับค่าต่ำสุดหรือสูงสุดได้หากคุณระบุฟังก์ชันคีย์เป็น min() และ max()
print(f"Output \n***{min(PlayerTitles, key=lambda k: PlayerTitles[k])} ")
ผลลัพธ์
***Zverev
5. อย่างไรก็ตาม หากต้องการค่าต่ำสุด คุณจะต้องทำการค้นหาเพิ่มเติม
min_titles = PlayerTitles[min(PlayerTitles, key=lambda k: PlayerTitles[k])] print(f"Output \n***{min_titles} ")
ผลลัพธ์
***0
6. วิธีแก้ปัญหาที่เกี่ยวข้องกับ zip() แก้ปัญหาโดย "กลับ" พจนานุกรมเป็นลำดับของคู่ (ค่า, คีย์) เมื่อทำการเปรียบเทียบสิ่งอันดับดังกล่าว องค์ประกอบค่าจะถูกเปรียบเทียบก่อน ตามด้วยคีย์
สิ่งนี้ทำให้เรามีพฤติกรรมที่เราต้องการอย่างแท้จริง และอนุญาตให้ดำเนินการลดและการเรียงลำดับในเนื้อหาพจนานุกรมได้อย่างง่ายดายโดยใช้คำสั่งเดียว
min_titles = min(zip(PlayerTitles.values(), PlayerTitles.keys())) max_titles = max(zip(PlayerTitles.values(), PlayerTitles.keys())) print(f"Output \n***{min_titles , max_titles} ")
ผลลัพธ์
***((0, 'Zverev'), (20, 'Nadal'))
7.ในทำนองเดียวกัน ในการจัดอันดับข้อมูล ให้ใช้ zip() กับ sorted()
titles_sorted = sorted(zip(PlayerTitles.values(), PlayerTitles.keys())) print(f"Output \n***{titles_sorted} ")
ผลลัพธ์
***[(0, 'Zverev'), (1, 'Theim'), (3, 'Murray'), (17, 'Djokovic'), (20, 'Federer'), (20, 'Nadal')]
8. เมื่อทำการคำนวณเหล่านี้ โปรดทราบว่า zip() จะสร้างตัววนซ้ำที่สามารถใช้ได้เพียงครั้งเดียวเท่านั้น
titles_and_players = zip(PlayerTitles.values(), PlayerTitles.keys()) print(f"Output \n***{min(titles_and_players)} ")
ผลลัพธ์
***(0, 'Zverev')
9. หากเราลองเรียกมันอีกครั้ง เราจะเผชิญกับข้อยกเว้นเป็นลำดับที่ว่างเปล่า
10.ควรสังเกตว่าในการคำนวณที่เกี่ยวข้องกับคู่ (ค่า, คีย์) คีย์จะถูกใช้เพื่อกำหนดผลลัพธ์ในกรณีที่รายการหลายรายการมีค่าเท่ากัน
ตัวอย่างเช่น ในการคำนวณเช่น min() และ max() รายการที่มีคีย์ที่เล็กที่สุดหรือใหญ่ที่สุดจะถูกส่งคืนหากมีค่าที่ซ้ำกัน นั่นคือเหตุผลที่เราเลือกผู้เล่นที่มีตำแหน่งสูงสุด เราลงเอยด้วยค่าเดียวคือ นาดาล (ดูขั้นตอนที่ 7)