Python 若一个循环更新了自身之外的内容,那个么如何构建一个等价的或lambda/列表理解?

Python 若一个循环更新了自身之外的内容,那个么如何构建一个等价的或lambda/列表理解?,python,python-3.x,loops,lambda,Python,Python 3.x,Loops,Lambda,问题是当循环引用并更新自身之外的内容时,如何使用列表理解/lambda+映射(以便将执行实际循环的任务推送到底层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

问题是当循环引用并更新自身之外的内容时,如何使用列表理解/lambda+映射(以便将执行实际循环的任务推送到底层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 
注意:句子是一个句子数组,每个句子都是一个单词数组

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

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)

I

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

此外,您进行更改的全部原因似乎是基于这样一个前提:使用
map
或理解肯定会更快。那可能不是真的。它们的速度可能大致相同,也可能较慢。我认为,您所能做的任何事情都不太可能使理解/
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
如前所述,如果要在一行中创建计数器,甚至可以使用
itertools
消除两个循环:

import itertools
from collections import Counter

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

列表理解和lambda+map不要将工作推到C中。理解和lambda是很好的工具,但是用它们来做这件事就是把一个正方形的钉子插进一个圆形的洞里。在这里,我可以使用
for
循环,或者类似于
collections.Counter(itertools.chain.from_iterable(句子_wiki))