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

Python: หาองค์ประกอบที่มีความถี่อยู่ในช่วงเปอร์เซ็นต์ที่กำหนด

บทนำ

โจทย์: จากลิสต์ข้อมูล หาองค์ประกอบที่มีความถี่ (frequency) อยู่ในช่วงเปอร์เซ็นต์ที่กำหนด (start% ถึง end%) ใช้ collections.Counter นับความถี่ แล้วคำนวณเปอร์เซ็นต์

ตัวอย่างโค้ด


from collections import Counter

my_list = [56, 34, 78, 90, 11, 23, 6, 56, 79, 90]
start, end = 13, 60  # ช่วงเปอร์เซ็นต์ 13% - 60%

print(f"ลิสต์: {my_list}")
print(f"ช่วงเปอร์เซ็นต์: {start}% - {end}%")

# นับความถี่
freq = Counter(my_list)
total = len(my_list)

# กรองตามช่วงเปอร์เซ็นต์
result = []
for element in set(my_list):  # ใช้ set เพื่อไม่วนซ้ำ
    percent = (freq[element] / total) * 100
    if start <= percent <= end:
        result.append(element)

print(f"ความถี่: {dict(freq)}")
print(f"ผลลัพธ์: {result}")

ผลลัพธ์


ลิสต์: [56, 34, 78, 90, 11, 23, 6, 56, 79, 90]
ช่วงเปอร์เซ็นต์: 13% - 60%
ความถี่: {56: 2, 34: 1, 78: 1, 90: 2, 11: 1, 23: 1, 6: 1, 79: 1}
ผลลัพธ์: [56, 90]

คำอธิบาย

  • จำนวนทั้งหมด: 10
  • 56: 2 ครั้ง = 20% ✓ (อยู่ใน 13-60%)
  • 90: 2 ครั้ง = 20% ✓
  • อื่นๆ: 1 ครั้ง = 10% ✗ (น้อยกว่า 13%)

เวอร์ชันสั้น (One-liner)


from collections import Counter

result = [
    elem for elem, count in Counter(my_list).items()
    if start <= (count / len(my_list)) * 100 <= end
]

ฟังก์ชันครบถ้วน


def elements_in_percent_range(lst, min_pct, max_pct):
    """คืนองค์ประกอบที่มี % frequency อยู่ในช่วง [min_pct, max_pct]"""
    if not lst:
        return []
    
    freq = Counter(lst)
    total = len(lst)
    
    return [
        elem for elem, count in freq.items()
        if min_pct <= (count / total) * 100 <= max_pct
    ]

# ทดสอบ
print(elements_in_percent_range([1,1,1,2,2,3,4,5,6,7], 20, 50))
# [1] → 30%
print(elements_in_percent_range([1,1,2,2,3,3,4,4], 20, 30))
# [1, 2, 3, 4] → ทุกค่า 25%

การประยุกต์: DataFrame Column


import pandas as pd

df = pd.DataFrame({'category': ['A','A','A','B','B','C','D','E','F','G']})
start, end = 15, 40

freq_pct = df['category'].value_counts(normalize=True) * 100
result = freq_pct[(freq_pct >= start) & (freq_pct <= end)].index.tolist()
print(result)  # ['A', 'B']  (A=30%, B=20%)

สรุป

ใช้ Counter นับความถี่ คำนวณเปอร์เซ็นต์ = count/len * 100 แล้วกรองตามช่วง ใช้ set(lst) หรือ Counter.items() เพื่อไม่วนซ้ำ สำหรับ DataFrame ใช้ value_counts(normalize=True)