【问题标题】:What is an equivalent list comprehension to these nested for loops?这些嵌套 for 循环的等效列表理解是什么?
【发布时间】:2014-07-17 21:32:10
【问题描述】:

我有一个名为 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

谁能解释这个错误的原因,以及我如何通过编写不同的列表理解来解决它?

【问题讨论】:

    标签: python list for-loop list-comprehension


    【解决方案1】:

    您的代码中有错字:

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

    list 替换为 lstlist 是 Python 中的类型名称,因此是 ValueError

    【讨论】:

    • 糟糕,我累了。下次发布到 Stack Overflow 之前,可能应该更彻底地阅读代码......
    • @xander 去过那里。 :)
    • 原代码转换每一行。您的代码将每一行转换为大小为 len(stops) 的字符串列表。
    • @Blender 同意。已编辑。谢谢
    • @shaktimaan 如果我想每次都从外部循环中打印出该行,我将如何去做?
    【解决方案2】:

    重现内部循环的唯一方法是使用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()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2016-12-26
      • 1970-01-01
      相关资源
      最近更新 更多