gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:19 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com