繁体   English   中英

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

[英]What is an equivalent list comprehension to these nested for loops?

我有博客的标题叫做列表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

有人可以解释此错误的原因,以及如何通过编写其他列表理解来解决该错误?

您的代码中有错字:

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

将该list替换为lst list是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]

请不要这样做。 您的代码很好。 如果要加快速度,只需预编译一次可替换所有单词的正则表达式即可。

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()))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM