【问题标题】:Filter array of objects in Python在 Python 中过滤对象数组
【发布时间】:2020-08-17 23:46:05
【问题描述】:

我正在使用 Python 挖掘一个相当大的项目并挖掘有关它的信息。我可以创建一个ProjectFiles 数组,但是我很难弄清楚如何过滤它。

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

如何为特定的repo 过滤ProjectFile 对象数组?

例如,假设我想过滤 repo 属性为 SomeCocoapod 的对象。

我已经查找了 filter 的示例,但我找到的所有内容都使用了简单的示例,例如 strint 的列表。

【问题讨论】:

    标签: python python-3.x oop


    【解决方案1】:

    假设您有一个包含两个 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
        ),
    ]
    

    然后您可以使用list comprehension 中的repo 属性过滤掉repo1

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

    以上假设您在ProjectFile 类中覆盖了__str____repr__,以提供过滤对象的字符串表示形式。否则你会得到类似[<__main__.ProjectFile object at 0x000001E879278160>] 的返回(如果这是你想看到的,那很好)。您可以查看How to print instances of a class using print()? 了解更多信息。

    【讨论】:

      【解决方案2】:

      您可以使用点表示法选择类的属性。

      假设arr 是一个ProjectFile 对象数组。现在你过滤 SomeCocoapod 使用。

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

      注意:这会返回一个过滤器对象,它是一个生成器。要返回过滤列表,您可以将其包装在列表构造函数中。

      作为一个非常 Pythonic 的替代方案,您可以使用列表推导:

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

      【讨论】:

      • 太棒了!在使用lambda 进行过滤时,我需要将过滤器包裹在list 中,并且效果很好:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2022-12-12
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多