สมมติว่าเรามีข้อมูลชุดหนึ่งที่อยากจัดกลุ่มตามตัวเลขตัวแรกของสมาชิก
data = [
(10, "ten"),
(1, "one"),
(2, "two"),
(5, "five"),
(20, "twenty"),
(3, "three"),
(1, "one-one"),
(7, "seven"),
(2, "two-two"),
(3, "three-three"),
(1, "one-one-one"),
(5, "five-five"),
]
และผลลัพธ์ที่เราต้องการคือ
{1: ['one', 'one-one', 'one-one-one']}
{2: ['two', 'two-two']}
{3: ['three', 'three-three']}
{5: ['five', 'five-five']}
{7: ['seven']}
{10: ['ten']}
{20: ['twenty']}
หากใช้ itertools.groupby ตรงๆ จะได้ผลลัพธ์ดังนี้
from itertools import groupby
from operator import itemgetter
for k, g in groupby(data, key=itemgetter(0)):
{k: list(map(itemgetter(1), g))}
{10: ['ten']}
{1: ['one']}
{2: ['two']}
{5: ['five']}
{20: ['twenty']}
{3: ['three']}
{1: ['one-one']}
{7: ['seven']}
{2: ['two-two']}
{3: ['three-three']}
{1: ['one-one-one']}
{5: ['five-five']}
จากผลลัพธ์จะพบว่า จะไม่ได้ตรงตามกับที่เราต้องการ วิธีการแก้ไข้คือ เราต้อง sort
ข้อมูลก่อนที่จะทำการ groupby
for k, g in groupby(sorted(data), key=itemgetter(0)):
{k: list(map(itemgetter(1), g))}
{1: ['one', 'one-one', 'one-one-one']}
{2: ['two', 'two-two']}
{3: ['three', 'three-three']}
{5: ['five', 'five-five']}
{7: ['seven']}
{10: ['ten']}
{20: ['twenty']}
ก็จะได้ผลลัพธ์ตามที่เราต้องการแล้ว
Top comments (0)