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

การจัดกลุ่มสมาชิกแบบ Binary Element ในลิสต์ Python

สมมติว่ามีลิสต์ของลิสต์ (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)