ในงานวิเคราะห์ข้อมูล มักต้องแบ่งลิสต์ขนาดใหญ่เป็นสับลิสต์ (sublists) ตามจุดตัดที่กำหนด บทความนี้เสนอ 2 วิธีในการทำ custom list split
1. ใช้ zip และ for loop
ใช้ list slicing ร่วมกับ zip เพื่อสร้างคู่ของดัชนีเริ่มต้นและสิ้นสุด จากนั้นสร้างสับลิสต์ด้วย list comprehension
ตัวอย่าง
Alist = ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]
# จุดตัดที่ต้องการแบ่ง (ดัชนี)
split_points = [2, 5, 8]
print("Given list : " + str(Alist))
print("The points of splitting : ", split_points)
# แบ่งลิสต์: zip([0] + split_points, split_points + [None])
split_list = [Alist[i: j] for i, j in zip([0] + split_points, split_points + [None])]
print("The split lists are : ", split_list)
ผลลัพธ์
Given list : ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4] The points of splitting : [2, 5, 8] The split lists are : [['Mon', 'Tue'], ['Wed', 6, 7], ['Thu', 'Fri', 11], [21, 4]]
2. ใช้ itertools.chain และ zip
ใช้ chain จากโมดูล itertools เพื่อสร้าง iterator ที่เชื่อมต่อลำดับดัชนี แล้วใช้ zip จับคู่ดัชนีเริ่ม-สิ้นสุด
ตัวอย่าง
from itertools import chain
Alist = ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]
split_points = [2, 5, 8]
print("Given list : ", str(Alist))
print("The points of splitting : ", split_points)
# สร้าง iterator สำหรับดัชนีเริ่มต้นและสิ้นสุด
sublists = zip(chain([0], split_points), chain(split_points, [None]))
split_list = list(Alist[i:j] for i, j in sublists)
print("The split lists are : ", split_list)
ผลลัพธ์
Given list : ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4] The points of splitting : [2, 5, 8] The split lists are : [['Mon', 'Tue'], ['Wed', 6, 7], ['Thu', 'Fri', 11], [21, 4]]
สรุป: วิธีที่ 1 ใช้ built-in functions เท่านั้น เข้าใจง่าย วิธีที่ 2 ใช้ itertools.chain เหมาะสำหรับข้อมูลขนาดใหญ่ที่ต้องการ memory efficiency