Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Gom nhóm phần tử nhị phân trong danh sách Python


Giả sử ta có danh sách các danh sách, mỗi danh sách con có hai phần tử. Một phần tử của mỗi danh sách con chung cho nhiều danh sách con khác. Ta cần tạo danh sách cuối cùng hiển thị các danh sách con được gom nhóm theo phần tử chung.

Với set và map

Trong danh sách cho trước, phần tử đầu là chuỗi, phần tử hai là số. Ta tạo list tạm chứa phần tử hai của mỗi danh sách con. Sau đó so sánh từng danh sách con với mỗi phần tử trong list tạm và thiết kế vòng lặp để gom nhóm.

Ví dụ

listA = [['Mon', 2], ['Tue', 3], ['Wed', 3], ["Thu", 1], ['Fri', 2], ['Sat', 3], ['Sun', 1]]
# Với set và map
temp = set(map(lambda i: i[1], listA))
res = [[j[0] for j in listA if j[1] == i] for i in temp]
# Kết quả
print("Danh sách với phần tử gom nhóm : \n", res)

Kết quả

Chạy mã trên cho kết quả sau:

Danh sách với phần tử gom nhóm : [['Thu', 'Sun'], ['Mon', 'Fri'], ['Tue', 'Wed', 'Sat']]

Với groupby và itemgetter

Hàm itemgetter lấy phần tử hai của mỗi danh sách con. Sau đó áp dụng groupby dựa trên kết quả từ itemgetter.

Ví dụ

from itertools import groupby
from operator import itemgetter
listA = [['Mon', 2], ['Tue', 3], ['Wed', 3], ["Thu", 1], ['Fri', 2], ['Sat', 3], ['Sun', 1]]
# Với groupby
listA.sort(key=itemgetter(1))
groups = groupby(listA, itemgetter(1))
res = [[i[0] for i in val] for (key, val) in groups]
# Kết quả
print("Danh sách với phần tử gom nhóm : \n", res)

Kết quả

Chạy mã trên cho kết quả sau:

Danh sách với phần tử gom nhóm : [['Thu', 'Sun'], ['Mon', 'Fri'], ['Tue', 'Wed', 'Sat']]

Với defaultdict

Áp dụng defaultdict lấy phần tử hai của danh sách con làm key của dictionary. Sau đó trong list kết quả, thêm giá trị từ phần tử đầu của danh sách con.

Ví dụ

import collections
listA = [['Mon', 2], ['Tue', 3], ['Wed', 3], ["Thu", 1], ['Fri', 2], ['Sat', 3], ['Sun', 1]]
# Với defaultdict
res = collections.defaultdict(list)
for val in listA:
    res[val[1]].append(val[0])
# Kết quả
print("Danh sách với phần tử gom nhóm : \n", res)

Kết quả

Chạy mã trên cho kết quả sau:

Danh sách với phần tử gom nhóm : defaultdict(, {2: ['Mon', 'Fri'], 3: ['Tue', 'Wed', 'Sat'], 1: ['Thu', 'Sun']})