Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

จะทำการคำนวณด้วยพจนานุกรมใน Python ได้อย่างไร


ปัญหา

คุณต้องการคำนวณต่างๆ (เช่น ค่าต่ำสุด ค่าสูงสุด การเรียงลำดับ ฯลฯ) ในพจนานุกรมของข้อมูล

วิธีแก้ปัญหา

เราจะสร้างพจนานุกรมที่มีผู้เล่นเทนนิสและชื่อแกรนด์สแลมของพวกเขา

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)