在Python中过滤对象数组

最后发布: 2020-07-09


问题

我正在使用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 对象为特定 repo?

例如,假设我想过滤的对象是其 repo 财产是 SomeCocoapod.

我找过一些例子 filter但我找到的所有东西都是用简单的例子,如 strint.

python-3.x
回答

你可以使用点符号来选择一个类的属性。

假设......你可以使用点符号选择一个类的属性。arr 是一个ProjectFile对象的数组。现在你可以使用.SomeCocoapod来过滤。

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

NB: 这将返回一个过滤器对象,这是一个生成器。为了得到一个过滤后的列表,你可以用一个列表构造函数来包装它。

作为一个非常Pythonic的替代方案,你可以使用list comprehensions。

filtered_arr = [p for p in arr if p.repo == "SomeCocoapod"]


回答

假设你有这样一个简单的列表: 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()打印一个类的实例? 以获取更多信息。