Python,基于匹配词筛选列表

2024-06-06 10:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

实现以下目标的更快方法是什么

# Expected Output for original_list 

['Ju Moran', 'Luo Jiangning', 'Wang Zhongbo', 'Luo Haibo']

# Expected Output for rule_filter

['McGill University', 'Oba School', 'Test Case Filter']

import re


filter_words = [
    'school',
    'university',
    'branch'
]

original_list = ['Ju Moran', 'Luo Jiangning', 'Wang Zhongbo',
                 'Luo Haibo', 'McGill University', 'Oba School', 'Test Case Filter']

rule_filter = [x for x in original_list if len(re.sub('\S+', '', x)) > 1]

[original_list.remove(i) for i in rule_filter]

以一种简单的方式,我试图删除具有多个空格且与myfilter_words匹配的元素

Previous code already handle the space part.


Tags: foroutputfilterrulelistluoexpectedoriginal
2条回答

可以使用for循环只读取原始列表一次,但需要另一个列表来存储结果,并在循环后将其重新分配回原始列表。另外,我认为count(" ")足够计算空间,不需要使用re。由于预期结果不区分大小写,因此使用lower()

new_original = []
rule_filter = []
for word in original_list:
    if word.count(" ") > 1 or any(filter_word.lower() in word.lower() for filter_word in filter_words):
        rule_filter.append(word)
    else:
        new_original.append(word)
original_list = new_original

print(original_list) # Output: ['Ju Moran', 'Luo Jiangning', 'Wang Zhongbo', 'Luo Haibo']
print(rule_filter) # Output: ['McGill University', 'Oba School', 'Test Case Filter']

列表理解版本将涉及两个for循环,但不需要额外的列表:

rule_filter = [w for w in original_list if w.count(" ") > 1 or any(f.lower() in w.lower() for f in filter_words)]
original_list = [w for w in original_list if w not in rule_filter]

我想你需要这样的东西:

filter_words = [
    'school',
    'university',
    'branch'
]

original_list = ['Ju Moran', 'Luo Jiangning', 'Wang Zhongbo',
                 'Luo Haibo', 'McGill University', 'Oba School', 'Test Case Filter']

f = [i for i in original_list if all(j.lower() not in i.lower() for j in filter_words)]

print(f)

如果您想区分大小写并分隔确切的单词,可以删除.lower()

相关问题 更多 >