什么是这些嵌套for循环的等价列表理解?

2024-10-03 15:34:18 发布

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

我有一个名为lst的博客标题列表和一个名为stops的停止词列表。你知道吗

这段代码完全符合我的要求,从lst中删除两个列表中出现的每个单词:

for line in lst:
    for stop in stops:
        line = re.sub(r"\b" + stop.rstrip("\n") + r"\b", "", line.lower())
    print(line)

然而,出于好奇和编写更简洁/高效代码的愿望,我想把它变成一个列表理解。你知道吗

我试过这个:

lst = [[re.sub(r"\b" + stop.rstrip("\n") + r"\b", "", line.lower()) for stop in stops] for line in list]

……但毫无效果。执行时,代码抛出ValueError异常,如下所示:

Traceback (most recent call last):
  File "F:\Visual Studio Projects\RBTrends\RBTrends\main.py", line 55, in <module> prepData()
  File "F:\Visual Studio Projects\RBTrends\RBTrends\main.py", line 42, in prepData
    filelst = aps.stripStopWords(filelst, STOP_WORDS_PATH)
  File "F:\Visual Studio Projects\RBTrends\RBTrends\articleprocesses.py", line 34, in stripStopWords
    lst = [[re.sub(r"\b" + stop.rstrip("\n") + r"\b", "", line.lower()) for stop in stops] for line in list]
TypeError: 'type' object is not iterable

有没有人能解释一下这个错误的原因,以及我如何通过写一个不同的列表来修正它?你知道吗


Tags: 代码inre列表forlinelowerfile
2条回答

您的代码中有一个输入错误:

lst = [[.... for stop in stops] for line in list]
                                            ^

lst替换listlist是Python中的类型名,因此ValueError。你知道吗

重现内部循环的唯一方法是使用reduce

from functools import reduce  # for Python 3

result = [reduce(lambda line, stop: re.sub(r'\b' + stop.rstrip('\n') + r'\b', '', line), stops, line.lower()) for line in lst]

请不要这样做。你的密码很好。如果你想加快速度,只需预先编译一个regex,一次替换所有单词。你知道吗

stop_regex = re.compile(r'\b' + r'\b|\b'.join(map(re.escape, stops)) + r'\b')

for line in lst:
    print(stop_regex.sub('', line.lower()))

相关问题 更多 >