Фильтровать массив объектов в Python - PullRequest
2 голосов
/ 03 мая 2020

Я использую Python, чтобы копаться в довольно большом проекте и собирать информацию о нем. Я могу создать массив из ProjectFile с, но мне трудно разобраться, как его фильтровать.

class ProjectFile:
    def __init__(self, filename: str,
                 number_of_lines: int,
                 language: str,
                 repo: str,
                 size: int):
        self.filename = filename
        self.number_of_lines = number_of_lines
        self.language = language
        self.repo = repo
        self.size = size

Как бы я отфильтровал массив объектов ProjectFile для специфика c repo?

Например, допустим, я хотел отфильтровать объекты, свойство repo которых равно SomeCocoapod.

Я искал примеры filter, но все, что я нашел, использует простые примеры, такие как списки str или int.

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

Вы можете выбрать атрибуты класса, используя точечную запись.

Предположим, arr - это массив объектов ProjectFile. Теперь вы используете фильтр для SomeCocoapod.

filter(lambda p: p.repo == "SomeCocoapod", arr)

Примечание: возвращает объект фильтра, который является генератором. Чтобы получить отфильтрованный список обратно, вы можете обернуть его в конструктор списка.

В качестве альтернативы Pythoni c вы можете использовать списочные выражения:

filtered_arr = [p for p in arr if p.repo == "SomeCocoapod"]
2 голосов
/ 03 мая 2020

Допустим, у вас есть этот простой список из двух ProjectFile объектов:

projects = [
    ProjectFile(
        filename="test1.txt",
        number_of_lines=1,
        language="English",
        repo="repo1",
        size=1,
    ),
    ProjectFile(
        filename="test2.txt", 
        number_of_lines=2, 
        language="German", 
        repo="repo2", 
        size=2
    ),
]

Затем вы можете отфильтровать repo1, используя атрибут repo внутри списка :

filtered = [project for project in projects if project.repo == "repo1"]

Выше предполагается, что вы переопределили __str__ или __repr__ внутри вашего класса ProjectFile, чтобы получить строковое представление отфильтрованных объектов. В противном случае вы получите что-то вроде [<__main__.ProjectFile object at 0x000001E879278160>] (это хорошо, если вы хотите это увидеть). Вы можете взглянуть на Как напечатать экземпляры класса, используя print ()? для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...