สมมติว่ามีลิสต์ของลิสต์ (List of lists) ซึ่งแต่ละ sublist มี 2 สมาชิก สมาชิกตัวที่ 2 ซ้ำกันในหลาย sublist เราต้องการจัดกลุ่ม sublist ตามสมาชิกตัวที่ 2 นี้
วิธีที่ 1: ใช้ set และ map
สร้าง set ของสมาชิกตัวที่ 2 (ค่าที่จะจัดกลุ่ม) แล้วใช้ list comprehension กรอง sublist ที่ตรงกัน
ตัวอย่าง
listA = [['Mon', 2], ['Tue', 3], ['Wed', 3], ['Thu', 1], ['Fri', 2], ['Sat', 3], ['Sun', 1]]
temp = set(map(lambda i: i[1], listA))
res = [[j[0] for j in listA if j[1] == i] for i in temp]
print("The list with grouped elements:\n", res)
ผลลัพธ์
The list with grouped elements: [['Thu', 'Sun'], ['Mon', 'Fri'], ['Tue', 'Wed', 'Sat']]
วิธีที่ 2: ใช้ itertools.groupby และ operator.itemgetter
เรียงลิสต์ตามสมาชิกตัวที่ 2 ก่อน แล้ว groupby
ตัวอย่าง
from itertools import groupby
from operator import itemgetter
listA = [['Mon', 2], ['Tue', 3], ['Wed', 3], ['Thu', 1], ['Fri', 2], ['Sat', 3], ['Sun', 1]]
listA.sort(key=itemgetter(1))
groups = groupby(listA, itemgetter(1))
res = [[i[0] for i in val] for (key, val) in groups]
print("The list with grouped elements:\n", res)
ผลลัพธ์
The list with grouped elements: [['Thu', 'Sun'], ['Mon', 'Fri'], ['Tue', 'Wed', 'Sat']]
วิธีที่ 3: ใช้ collections.defaultdict (แนะนำ)
ใช้ defaultdict(list) สะสมค่าโดยอัตโนมัติ ไม่ต้องเช็ค key มีอยู่แล้วหรือไม่
ตัวอย่าง
import collections
listA = [['Mon', 2], ['Tue', 3], ['Wed', 3], ['Thu', 1], ['Fri', 2], ['Sat', 3], ['Sun', 1]]
res = collections.defaultdict(list)
for val in listA:
res[val[1]].append(val[0])
print("The list with grouped elements:\n", res)
ผลลัพธ์
The list with grouped elements: defaultdict(, {2: ['Mon', 'Fri'], 3: ['Tue', 'Wed', 'Sat'], 1: ['Thu', 'Sun']})
วิธีที่ 3 เขียนสะดวกที่สุดและอ่านง่าย แปลงเป็น dict ธรรมดาได้ด้วย dict(res)