Hướng dẫn python groupby list of objects - python nhóm theo danh sách các đối tượng

Đâ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]]

Tôi có thể nhóm một danh sách trong Python không?

Trong Python, bạn có thể nhóm các yếu tố liên tiếp có cùng giá trị trong một đối tượng có thể lặp lại như một danh sách với itertools.groupby ().you can group consecutive elements of the same value in an iterable object such as a list with itertools. groupby() .

Làm thế nào để bạn nhóm các mục tương tự với một danh sách trong Python?

Phương thức Groupby sẽ nhóm tất cả các chuỗi tương tự thành một đối tượng ITER ...
Khởi tạo danh sách các chuỗi ..
Nhập mô -đun Itertools ..
Khởi tạo một danh sách trống ..
Bây giờ, chuyển các chuỗi và chức năng Lambda cho itertools.....
Hàm Lambda sẽ trả về phần đầu tiên của chuỗi sau khi chia nó bằng -.

Đối tượng nhóm trong Python là gì?

Các nhóm là cơ chế container mà các tệp HDF5 được tổ chức.Từ góc độ Python, họ vận hành hơi giống như từ điển.Trong trường hợp này, các phím của người Viking là tên của các thành viên trong nhóm và các giá trị của người dùng là các đối tượng của các thành viên (nhóm và tập dữ liệu).the container mechanism by which HDF5 files are organized. From a Python perspective, they operate somewhat like dictionaries. In this case the “keys” are the names of group members, and the “values” are the members themselves ( Group and Dataset ) objects.