Python如何删除带有黑名单的项目列表,不删除

时间:2016-08-16 15:20:59

标签: python

我有一个删除项目列表的实用程序,但我想知道如何添加不删除项目的黑名单过滤器。

这就是我现在所拥有的,我运行脚本几次更改if" Languages"在项目中:删除不同项目的行。

def delete_projects():
    projects = get_projects()
    # black_list = [some list of projects that I would like to delete but don't have an exact file name (i.e. "order-*")]
    for project in projects:
    if "Languages" in project:
         delete_project(project)

我想这样做,这样我就可以获得项目列表并使用black_list检查名称为LIKE xyz *的项目,而不是删除。我怎么能这样做?

谢谢!

更新:这只是我目前的实施思路。使用正则表达式实现它并删除与正则表达式不匹配的项目会更好吗?如果可以的话,我需要正则表达式的帮助。

5 个答案:

答案 0 :(得分:2)

创建一个只包含名称在黑名单中的元素的新列表相对简单:

projects = [project for project in projects if project not in blacklist]

但是,当黑名单包含模式时,条件可能需要更复杂。排除与任何黑名单模式匹配的项目的一种方法是

projects = [p for p in projects if any(patt.match(p) for patt in blacklist)]

这将保留至少与其中一种模式匹配的项目。

答案 1 :(得分:0)

您可以使用Python any

BLACKLIST = {'languages'}

def delete_projects():
    projects = get_projects()
    for project in projects:
       if any(term in project for term in BLACKLIST):
         delete_project(project)

顺便说一句,我强烈建议首先运行带有delete_project(project)行注释掉的代码并替换为项目字符串表示的打印,以确保在执行之前删除正确的项目真实的;)

答案 2 :(得分:0)

你可以像这样使用list comprehension

projects = [p for p in get_projects() if p in to_keep]

如果要选择不在列表中的对象,请执行以下操作:

projects = [p for p in get_projects() if p not in to_exclude]

请注意,这适用于完全匹配。如果要处理子字符串,可以执行以下操作:

projects = [p for p in get_projects() if not any(substr in p for substr in to_exclude)]

答案 3 :(得分:0)

import re
black_list_of_regex = ['order-.*', 'normal_name']
print([project for project in projects for reg in black_list_of_regex if re.match(reg, project)])

请记住,如果您想匹配全名,则应在正则表达式中使用开始/结束字符串regexp ^$

希望有所帮助

答案 4 :(得分:0)

如果projects是字符串,并且您有blacklist,那么您可以这样做:

set(projects) - set(blacklist)

您可以通过以下方式创建黑名单:

blacklist = [project for project in projects if 'Languages' in project]

另一个选项,没有黑名单

filter(lambda project: "Languages" not in project, projects)

修改

如果您需要保存具有特定模式的项目,我会使用正则表达式:

import re

pattern = '^XYZ.*'

projects = [project for project in projects if re.search(pattern, project)]

如果你有一个单词黑名单,那么你可以这样做:

projects = [project for project in projects if any(pat in project for pat in blacklist)]