Trước khi gọi groupby, bạn cần sắp xếp dữ liệu của mình trước. Điều này sắp xếp các nhóm tại chỗ theo Id của loại nhóm
groups.sort[key=lambda x: x[1].Id]
Và sau đó trong nhóm, bạn hiện đang trả về trình vòng lặp thay vì danh sách các phần tử. Bạn có thể chuyển đổi nó thành một danh sách bằng cách gói nó với list[]
. Bạn cũng sẽ cần sử dụng Id của loại nhóm thay vì chính loại nhóm đó trong biểu thức lambda
Gần đây, tôi gặp một vấn đề mà tôi phải nhóm các đối tượng của một danh sách theo giá trị thuộc tính của các đối tượng này. Sau khi thử một số thứ, tôi quyết định sử dụng hàm groupby
từ mô-đun
letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
0Hãy xem xét ví dụ sau, chúng ta có một lớp Letter với hai thuộc tính. một chuỗi để chỉ định ký tự và một boolean để chỉ định xem chữ cái đó có phải là nguyên âm hay không. Chúng tôi muốn nhóm các đối tượng Thư dựa trên thuộc tính
letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
1 của chúngLớp này trông như sau,
letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
2 chỉ ở đó để có một biểu diễn chuỗi gọn gàng khi sau này chúng ta in ra các đối tượngclass Letter:
def __init__[self, char: str, vowel: bool] -> None:
self.char = char
self.vowel = vowel
def __repr__[self] -> str:
return self.char
Tiếp theo chúng ta tạo một danh sách với các đối tượng Letter. Không phải toàn bộ bảng chữ cái, vài chữ cái đầu tiên sẽ làm được
letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
Bây giờ chúng tôi nhóm danh sách
letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
3 của chúng tôi chứa các đối tượng letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
0 dựa trên giá trị của thuộc tính letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
1 của chúng. Việc nhóm này được thực hiện bởi hàm khóa mà chúng tôi chuyển đến groupby
làm đối số thứ hai, danh sách chính nó là đối số đầu tiênfrom itertools import groupby
sorted_letters = sorted[letters, key=lambda letter: letter.vowel]
grouped = [list[result] for key, result in groupby[
sorted_letters, key=lambda letter: letter.vowel]]
print[grouped]
# => [[b, c, d], [a, e]]
Một vấn đề cần lưu ý là danh sách hoặc bất kỳ khả năng lặp nào khác cần được sắp xếp trước khi chuyển nó tới hàm groupby
. Nếu không, các nhóm của bạn kết thúc với một kết quả được phân đoạn. Để minh họa, hãy xem ví dụ sau khi sắp xếp được nhận xét. Như bạn thấy, groupby
tạo thành các nhóm liên tiếp
Viết chương trình Python để tạo một từ điển nhóm một chuỗi các cặp khóa-giá trị thành một danh sách từ điển
Giải pháp mẫu
Mã Python
def grouping_dictionary[l]:
result = {}
for k, v in l:
result.setdefault[k, []].append[v]
return result
colors = [['yellow', 1], ['blue', 2], ['yellow', 3], ['blue', 4], ['red', 1]]
print["Original list:"]
print[colors]
print["\nGrouping a sequence of key-value pairs into a dictionary of lists:"]
print[grouping_dictionary[colors]]
Đầu ra mẫu
Original list: [['yellow', 1], ['blue', 2], ['yellow', 3], ['blue', 4], ['red', 1]] Grouping a sequence of key-value pairs into a dictionary of lists: {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}
Trình bày bằng hình ảnh
Sơ đồ
Trực quan hóa việc thực thi mã Python
Công cụ sau đây trực quan hóa những gì máy tính đang làm từng bước khi nó thực thi chương trình nói trên