โจทย์: ให้ลิสต์สตริงที่มีรูปแบบ "prefix-suffix" จัดกลุ่มตาม prefix (ส่วนหน้าของ -)
Input/Output
Input: ['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript', 'python-1', 'python-2', 'javascript-1'] Output: [['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript'], ['python-1', 'python-2'], ['javascript-1']]
วิธีแก้: ใช้ itertools.groupby
groupby จัดกลุ่มสมาชิกที่ติดกันและมี key เหมือนกัน ต้อง sort ก่อนหรือข้อมูลอยู่เรียงแล้ว
import itertools
strings = ['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript', 'python-1', 'python-2', 'javascript-1']
result = []
iterator = itertools.groupby(strings, lambda s: s.split('-')[0])
for key, group in iterator:
result.append(list(group))
print(result)
ผลลัพธ์
[['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript'], ['python-1', 'python-2'], ['javascript-1']]
ข้อสังเกต: groupby จะจัดกลุ่มเฉพาะสมาชิกที่ ติดกัน เท่านั้น หากข้อมูลไม่ได้เรียงตาม prefix ต้อง sorted(strings, key=lambda s: s.split('-')[0]) ก่อน
การประยุกต์: ใช้จัดกลุ่ม Log files, URLs, Categories, Tags ฯลฯ