我有一个清单清单如下。
sentences = [
["my", "first", "question", "in", "stackoverflow", "is", "my", "favorite"],
["my", "favorite", "language", "is", "python"]
]
Run Code Online (Sandbox Code Playgroud)
我想获取sentences列表中每个单词的计数。因此,我的输出应如下所示。
{
'stackoverflow': 1,
'question': 1,
'is': 2,
'language': 1,
'first': 1,
'in': 1,
'favorite': 2,
'python': 1,
'my': 3
}
Run Code Online (Sandbox Code Playgroud)
我目前正在做如下。
frequency_input = [item for sublist in sentences for item in sublist]
frequency_output = dict(
(x,frequency_input.count(x))
for x in set(frequency_input)
)
Run Code Online (Sandbox Code Playgroud)
但是,对于长列表而言,它根本没有效率。我的名单很长,名单上有大约一百万个句子。我花了两天时间来运行它,并且它仍在运行。
在这种情况下,我想提高程序效率。我当前的第一行代码是O(n^2),第二行是O(n)。请让我知道python中是否有更有效的方法。如果我可以用比现在少的时间运行它,那将是非常理想的。我不担心空间的复杂性。
如果需要,我很乐意提供更多详细信息。
一种更简单,更高效的方法是使用来展平列表itertools.chain,并使用以下方法对字符串进行计数collections.Counter:
from collections import Counter
from itertools import chain
Counter(chain.from_iterable(sentences))
Counter({'my': 3,
'first': 1,
'question': 1,
'in': 1,
'stackoverflow': 1,
'is': 2,
'favorite': 2,
'language': 1,
'python': 1})
Run Code Online (Sandbox Code Playgroud)