บทนำ
โจทย์: จากลิสต์ข้อมูล หาองค์ประกอบที่มีความถี่ (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)