问题是当循环引用和更新自身之外的内容时,如何使用列表理解/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/