gpt4 book ai didi

python - 如何用一种算法让白名单功能更加有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:32 25 4
gpt4 key购买 nike

我设计了一个白名单功能来过滤windows中的文件路径。可以过滤三种类型的模式:

  • 根据后缀过滤路径,如所有txt文件。
  • 从左开始过滤路径,例如过滤所有以“C:\Windows\System32”开头的路径
  • 过滤包含特殊词的路径,例如过滤所有包含“system”的路径。

图案以以下格式保存:

patternList = [{'type': 'suffix', 'content':'\.txt'},
{'type': 'keyword', 'content':'system'},
{'type': 'left', 'content': 'C:\Windows\System32'}]

每个字典都是一个模式,所有模式都在一个名为 patternList 的列表中。

然后,我有另一个名为 pathInfoObjectList 的列表,其中包含许多对象,每个对象都有一个名为“filelist”的属性,它是一个列表。在文件列表中,有一些文件路径。

现在,我想使用该模式删除文件列表中的每个路径。

我的方法是将模式更改为正则表达式以完成工作。

我的代码在这里:

patternRegexList = []
for each in patternList:
if each['type'] == 'suffix':
patternRegex = '.*?' + each['content'] + '$'
elif each['type'] == 'keyword':
patternRegex = '.*?' + each['content'] + '.*?'
elif each['type'] == 'left':
patternRegex = '^' + each['content'] + '.*?'
patternRegexList.append(patternRegex)


for pathInfoObject in pathInfoObjectList:
for path in pathInfoObject.filelist[:]:
for patternRegex in patternRegexList:
if re.match(patternRegex, path):
pathInfoObject.filelist.remove(path)
break

但我觉得我的算法太蠢了,而且是O(n^{3}) .

你有完成任务的聪明方法吗?

因为现在我发现缺乏算法知识导致我的代码无效,你有什么建议可以让我更好地学习算法吗?我认为通过阅读算法导论来学习太慢了。有没有更有效的学习方法?

最佳答案

它看起来更像是黑名单而不是白名单,但如果我弄错了,很容易修复它。

我首先尝试以更清晰、更灵活的方式表达您的规则。我也尽量避免使用无用的正则表达式,它们可能会花费你很多时间。最后,通过使用 any,我避免了在第一个匹配时测试每个排除规则。在 for 循环中使用 continue 具有相同的效果。

exclusion_rules = [
lambda path: path.endswith('.txt'),
lambda path: 'system' in path,
lambda path: path.startswith(r'c:\Windows\System32')]

for pathInfoObject in pathInfoObjectList:
pathInfoObject.filelist = filter(
lambda path: not any(rule(path) for rule in exclusion_rules),
pathInfoObject.filelist)

另一种使用列表理解而不是过滤器的方法:

for pathInfoObject in pathInfoObjectList:
pathInfoObject.filelist = [path for path in pathInfoObject.filelist if
not any(rule(path) for rule in exclusion_rules)]

关于python - 如何用一种算法让白名单功能更加有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37374617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com