[英]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.