Đây là hai trường hợp. Cả hai đều yêu cầu nhập khẩu sau:
import itertools
import operator
Bạn sẽ sử dụng itertools.groupby và adyer.attrgetter hoặc toán tử.itemgetter.
Cho một tình huống bạn đang nhóm theo
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
0:get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
Cho
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
1:get_item = operator.itemgetter[some_index]
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_item], get_item]]
Lưu ý rằng bạn cần sắp xếp vì
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
2 tạo ra một nhóm mới khi giá trị của khóa thay đổi.Lưu ý rằng bạn có thể sử dụng điều này để tạo một
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
3 như câu trả lời của S.Lott, nhưng không phải sử dụng get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
4.Sử dụng sự hiểu biết từ điển [chỉ hoạt động với Python 3+ và có thể là Python 2.7 nhưng tôi không chắc chắn]:
groupdict = {k: g for k, g in itertools.groupby[sorted_list, keyfunction]}
Đối với các phiên bản trước của Python, hoặc như một sự thay thế ngắn gọn hơn:
groupdict = dict[itertools.groupby[sorted_list, keyfunction]]
Gần đây tôi đã gặp phải một vấn đề mà tôi phải nhóm các đối tượng của một danh sách duy nhất theo giá trị của một thuộc tính của các đối tượng này. Sau khi thử một số điều, tôi đã giải quyết chức năng
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
5 từ mô -đun get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
6.Hãy xem xét ví dụ sau, chúng tôi có một lớp chữ cái với hai thuộc tính: một chuỗi để chỉ định ký tự và boolean để chỉ định chữ cá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
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
7 của họ.Lớp này trông như sau,
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
8 chỉ ở đó để có một biểu diễn chuỗi gọn gàng khi sau đó chúng ta in ra các đối tượng.class 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 tôi tạo một danh sách với các đối tượng chữ cái. Không phải toàn bộ bảng chữ cái, các chữ cái đầu tiên sẽ làm.
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
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
9 của chúng tôi chứa các đối tượng get_item = operator.itemgetter[some_index]
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_item], get_item]]
0 dựa trên giá trị của thuộc tính get_item = operator.itemgetter[some_index]
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_item], get_item]]
1 của chúng. Nhóm này được thực hiện bởi chức năng chính mà chúng tôi chuyển sang get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
5 như một đối số thứ hai, bản thân danh sách là đối số đầu tiên.from 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 gotcha là danh sách, hoặc bất kỳ điều gì khác, cần phải được sắp xếp trước khi chuyển nó đến hàm
get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
5. Nếu không, các nhóm của bạn kết thúc với một kết quả phân đoạn. Để minh họa xem ví dụ sau đây khi phân loại được nhận xét. Như bạn thấy get_attr = operator.attrgetter['some_attr']
new_list = [list[g] for k, g in itertools.groupby[sorted[old_list, key=get_attr], get_attr]]
5 làm cho các nhóm liên tiếp.from itertools import groupby
# letters = sorted[letters, key=lambda letter: letter.vowel]
grouped = [list[result] for key, result in groupby[
letters, key=lambda letter: letter.vowel]]
print[grouped]
# => [[a], [b, c, d], [e]]
Toàn bộ mẫu mã của chúng tôi trông giống như:
from itertools import groupby
class Letter:
def __init__[self, char: str, vowel: bool] -> None:
self.char = char
self.vowel = vowel
def __repr__[self] -> str:
return self.char
letters = [
Letter['a', True],
Letter['b', False],
Letter['c', False],
Letter['d', False],
Letter['e', True],
]
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]]