Pythonic相当于这个功能?

Rob*_*ino 4 python

我有一个从另一种语言移植的功能,你能帮我把它变成"pythonic"吗?

这里的函数以"非pythonic"的方式移植(这是一个人为的例子 - 每个任务都与项目或"无"相关联,我们需要一个不同项目的列表,不同的意思是没有重复的.identifier属性,从任务列表开始):

@staticmethod
def get_projects_of_tasks(task_list):

    projects = []
    project_identifiers_seen = {}

    for task in task_list:

        project = task.project

        if project is None:
            continue

        project_identifier = project.identifier

        if project_identifiers_seen.has_key(project_identifier):
            continue

        project_identifiers_seen[project_identifier] = True
        projects.append(project)

    return projects
Run Code Online (Sandbox Code Playgroud)

我特别没有开始让它"pythonic"不要从错误的脚开始(例如列表理解"如果project.identifier不是None,filter()基于查找基于字典的标识符注册表的谓词,使用set()去除重复项等)

编辑:

根据反馈,我有这个:

@staticmethod
def get_projects_of_tasks(task_list):

    projects = []
    project_identifiers_seen = set()

    for task in task_list:

        project = task.project

        if project is None:
            continue

        project_identifier = project.identifier

        if project_identifier in project_identifiers_seen:
            continue

        project_identifiers_seen.add(project_identifier)
        projects.append(project)

    return projects
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 7

关于这段代码没有任何大量的非语言.一些可能的改进:

  • project_identifiers_seen 可以是一个集合,而不是字典.
  • foo.has_key(bar) 拼写得更好 bar in foo
  • 我怀疑这是staticmethod一堂课.除非你实际上在进行数据封装,否则通常不需要Python中的类.如果这只是一个普通函数,请将其设置为模块级函数.