计算嵌套列表中的字符串

EmJ*_*EmJ 8 python list

我有一个清单清单如下。

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中是否有更有效的方法。如果我可以用比现在少的时间运行它,那将是非常理想的。我不担心空间的复杂性。

如果需要,我很乐意提供更多详细信息。

yat*_*atu 9

一种更简单,更高效的方法是使用来展平列表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)

  • 或`Counter(子列表中的子列表中的项目,子列表中的项目中的子列表中的项),因为主要的外卖点是使用`Counter`。 (2认同)