python - 如果循环更新其自身之外的内容 - 如何构建等效的或 lambda/列表理解?

标签 python python-3.x loops lambda

问题是当循环引用和更新自身之外的内容时,如何使用列表理解/lambda+map(以便将执行实际循环的任务推送到底层 c)?

我的例子是这样的:

words = []
wordCount = {}

for i in tqdm_notebook(range (0,len(sentences_wiki))):
   sentences_wiki[i]
     for j in range (0,len(sentences_wiki[i])):
       word = sentences_wiki[i][j]
       if word not in words:
         words.append(word)
         wordCount[word]= 1
       else:
         wordCount[word] = wordCount[word] + 1 

注意句子_wiki 是一个句子数组 - 每个句子都是一个单词数组。

作为一次尝试,我最终得到了以下非功能性示例

def blah(listy_words,words,wordCount):
  if word not in listy_words:
    words.append(word)
    wordCount[word]= 1
  else:
    wordCount[word] = wordCount[word] + 1     
  return(words)

words = []
wordCount = {}

a = map(lambdap:list(map(blah(p, words, wordCount), sentences_wiki[i])), sentences_wiki)
p=list(a)

最佳答案

您不应该仅仅为了您所应用的函数的副作用而使用 map 或列表理解。仅当结果列表包含有意义的数据时才应使用它。在您的情况下,您将创建一个大的嵌套列表列表,其中包含对您在全局级别创建的同一 words 列表的重复引用。这根本没用。

此外,您进行更改的全部原因似乎是基于使用 map 或理解肯定会更快的前提。这可能不是真的。它们的速度可能大致相同,也可能更慢。我认为您所做的任何事情都不可能使理解/映射版本比显式循环更快。主要原因是 Python 中的函数调用非常慢,因此需要将一些循环逻辑打包到函数中,这使得该部分比显式循环慢。

通常更快的方法是使用内置函数或类型在 C 中为您进行迭代,而无需返回 Python 代码。在您的示例中,您想要计算列表列表中的单词数,因此使用collections.Counter可能是一个好主意。我可能会做这样的事情,消除内部循环,同时保留外部循环:

from collections import Counter

word_counts = Counter()
for sentence in sentences_wiki:
    word_counts.update(sentence)
words = list(word_counts) # get a list of keys, if you really need it separate from the count

Patrick Haugh评论说,如果您想在一行中创建计数器,甚至可以使用 itertools 消除两个循环:

import itertools
from collections import Counter

word_counts = Counter(itertools.chain.from_iterable(sentences_wiki))
words = list(word_counts)

关于python - 如果循环更新其自身之外的内容 - 如何构建等效的或 lambda/列表理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48554495/

相关文章:

javascript - 将新属性推送到循环内的当前对象

python - 是否有 Tensorflow Object Detection API 的发布版本?

python - python中去除异常值的函数

python - 正则表达式用于查找表达式之间的文本,其中一个匹配的结束可能是下一个匹配的开始

swift - while 循环回到不应该的地方。 ( swift )

java - 完成链表排序后,我不确定如何跳出循环

python - 为什么我不能通过 id 更新嵌套序列化器?

python - sys.path.insert 无法导入其他 python 文件

python - 在 Flask API 中查看函数之前修改请求数据

python - Python在比较int和float时什么时候进行类型转换?