บทความนี้มุ่งเป้าไปที่นักพัฒนาที่ต้องการค้นหารายการที่ใหญ่ที่สุดหรือเล็กที่สุดด้วย Python ฉันจะแสดงวิธีการใช้งานสองสามวิธี และจะสรุปวิธีที่ดีที่สุดสำหรับคุณ
วิธีการ – 1:วิธี Slice ในรายการ
หากคุณเพียงแค่พยายามค้นหารายการที่เล็กที่สุดหรือใหญ่ที่สุดเพียงรายการเดียว นั่นคือ N =1 จะใช้ min() และ max() ได้เร็วกว่า
ให้เราเริ่มต้นด้วยการสร้างจำนวนเต็มสุ่ม
import random # Create a random list of integers random_list = random.sample(range(1,10),9) random_list
ผลลัพธ์
[2, 4, 5, 1, 7, 9, 6, 8, 3]
การค้นหารายการที่เล็กที่สุดและใหญ่ที่สุด (N=1)
# Find the smallest number (N=1) min ( random_list )
ผลลัพธ์
1
# Find the largest number (N=1) max ( random_list )
ผลลัพธ์
9
ค้นหา 3 รายการที่เล็กที่สุดและใหญ่ที่สุด (N=3)
ในทำนองเดียวกัน หาก N มีขนาดใกล้เคียงกับตัวคอลเล็กชัน โดยปกติแล้วจะเร็วกว่าในการจัดเรียงก่อนและแยกส่วนของ N
# lets get the nsmallest using a slice approach(N=3) sorted(random_list)[:3]
ผลลัพธ์
[1, 2, 3]
# lets get the nlargest using a slice approach(N=3) sorted(random_list)[-3:]
ผลลัพธ์
[7, 8, 9]
วิธีการ – 2:วิธี heapq ในรายการ
โมดูล heapq มีสองฟังก์ชัน—nlargest() และ nsmallest() ที่สามารถใช้เพื่อค้นหารายการที่ nsmallest หรือ nbigest
import heapq import random random_list = random.sample(range(1,10),9) # nsmallest items (N=3) heapq.nsmallest(3,random_list)
ผลลัพธ์
[1, 2, 3]
# nlargest items (N=3) heapq.nlargest(3,random_list)
ผลลัพธ์
[9, 8, 7]
หากคุณมีข้อมูลที่ซับซ้อนกว่านี้เล็กน้อย ฟังก์ชัน heapq จะมีพารามิเตอร์หลักที่สามารถใช้ได้
import heapq grandslams = [ {'name':'Roger Federer','titles':20}, {'name:'Rafel Nadal','titles':19}, {'name':'Novak Djokovic','titles':17}, {'name':'Andy Murray','titles':3},] # Players with less titles (N=3) less = heapq.nsmallest(3,grandslams, key = lambdas:s['titles']) less
ผลลัพธ์
[{'name': 'Andy Murray', 'titles': 3}, {'name': 'Novak Djokovic', 'titles': 17}, {'name': 'Rafel Nadal', 'titles': 19}]
# Players with highest titles (N=3) more = heapq.nlargest(3,grandslams,key = lambdas:s['titles']) more
ผลลัพธ์
[{'name': 'Roger Federer', 'titles': 20}, {'name': 'Rafel Nadal', 'titles': 19}, {'name': 'Novak Djokovic', 'titles': 17}]
การหา N ที่ใหญ่ที่สุดและเล็กที่สุดจาก DataFrame
โลกนี้ประกอบขึ้นด้วยไฟล์ CSV ใช่แล้ว!
ดังนั้นจึงปลอดภัยมากที่จะสรุปว่าเมื่อถึงจุดหนึ่งในการพัฒนา python คุณจะพบกับ CSV และ DataFrame ที่เห็นได้ชัด
ฉันจะแสดงวิธีการสองสามวิธีในการค้นหา N ที่ใหญ่ที่สุด/เล็กที่สุดจาก DataFrame
ในวิธีแรก เราจะจัดเรียงค่าโดยใช้วิธี sort_values() และเลือกค่าโดยใช้วิธี head
import pandas as pd import io # Define your data data = """ player,titles Djokovic,17 Nadal,19 Federer,20 Murray,3 """ throwaway_storage = io.StringIO(data) df = pd.read_csv(throwaway_storage,index_col = "player")
# nsmallest (N = 3) df.sort_values("titles").head(3)
ผลลัพธ์
player title _______________ Murray 3 Djokovic 17 Nadal 19
# nlargest (N = 3) df.sort_values("titles",ascending = False).head(3)
ผลลัพธ์
player title _______________ Federer 20 Nadal 19 Djokovic 17
แทนที่จะเรียงลำดับแถวและใช้เมธอด .head() เราสามารถเรียกเมธอด .nsmallest() และ .nlargest() ได้
df.nsmallest(3,columns="titles")
ผลลัพธ์
player title _______________ Murray 3 Djokovic 17 Nadal 19
df.nlargest(3,columns = "titles")
ผลลัพธ์
player title _______________ Federer 20 Nadal 19 Djokovic 17
บทสรุป
หากคุณกำลังพยายามค้นหาจำนวนรายการที่ค่อนข้างน้อย ฟังก์ชัน nlargest() และ nsmallest() จะเหมาะสมที่สุด
หากคุณเพียงแค่พยายามค้นหารายการที่เล็กที่สุดหรือใหญ่ที่สุดเพียงรายการเดียว (N=1) คุณจะใช้ min() และ max() ได้เร็วกว่า
ในทำนองเดียวกัน หาก N มีขนาดใกล้เคียงกับตัวคอลเล็กชัน การจัดเรียงก่อนและแยกส่วนจะเร็วกว่า
โดยสรุป การใช้งานจริงของ nlargest() และ nsmallest() สามารถปรับเปลี่ยนวิธีการทำงานของ python และจะดำเนินการปรับให้เหมาะสมบางอย่างในนามของคุณ