Python 计算术语频率的最简单方法,无需在bag ADT上使用计数器类

Python 计算术语频率的最简单方法,无需在bag ADT上使用计数器类,python,algorithm,multiset,Python,Algorithm,Multiset,我有一些代码可以很好地使用计数器类导入计算所选列表上的术语频率 from collections import Counter terms=['the', 'fox', 'the', 'quick', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog'] tf = Counter(terms) print(tf) 现有的代码工作得很好,但我想知道在没有python计数器类帮助的情况下,严格使用bag/multiset ADT实现相同结果的最简单的方法

我有一些代码可以很好地使用计数器类导入计算所选列表上的术语频率

from collections import Counter

terms=['the', 'fox', 'the', 'quick', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

tf = Counter(terms)

print(tf)
现有的代码工作得很好,但我想知道在没有python计数器类帮助的情况下,严格使用bag/multiset ADT实现相同结果的最简单的方法是什么


我花了好几天的时间尝试代码,并在其他论坛上浏览,但都没有取得多大成功。

您可以使用一本词典:

terms=['the', 'fox', 'the', 'quick', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
new_terms = {term:terms.count(term) for term in terms}
输出:

{'lazy': 1, 'over': 1, 'fox': 2, 'dog': 1, 'quick': 1, 'the': 3, 'jumps': 1}
[Multiset({'dog': 1}), Multiset({'fox': 2}), Multiset({'jumps': 1}), Multiset({'lazy': 1}), Multiset({'over': 1}), Multiset({'quick': 1}), Multiset({'the': 3})]
使用
multiset

import itertools
import multiset
final_data = [multiset.Multiset(list(b)) for a, b in itertools.groupby(sorted(terms))]
输出:

{'lazy': 1, 'over': 1, 'fox': 2, 'dog': 1, 'quick': 1, 'the': 3, 'jumps': 1}
[Multiset({'dog': 1}), Multiset({'fox': 2}), Multiset({'jumps': 1}), Multiset({'lazy': 1}), Multiset({'over': 1}), Multiset({'quick': 1}), Multiset({'the': 3})]

您可以使用单个词典:

terms=['the', 'fox', 'the', 'quick', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
new_terms = {term:terms.count(term) for term in terms}
输出:

{'lazy': 1, 'over': 1, 'fox': 2, 'dog': 1, 'quick': 1, 'the': 3, 'jumps': 1}
[Multiset({'dog': 1}), Multiset({'fox': 2}), Multiset({'jumps': 1}), Multiset({'lazy': 1}), Multiset({'over': 1}), Multiset({'quick': 1}), Multiset({'the': 3})]
使用
multiset

import itertools
import multiset
final_data = [multiset.Multiset(list(b)) for a, b in itertools.groupby(sorted(terms))]
输出:

{'lazy': 1, 'over': 1, 'fox': 2, 'dog': 1, 'quick': 1, 'the': 3, 'jumps': 1}
[Multiset({'dog': 1}), Multiset({'fox': 2}), Multiset({'jumps': 1}), Multiset({'lazy': 1}), Multiset({'over': 1}), Multiset({'quick': 1}), Multiset({'the': 3})]

您可以使用通用的
dict
循环术语,并使用带有默认值的
get
更新计数:

tf = {}
for t in terms:
    tf[t] = tf.get(t, 0) + 1

您可以使用通用的
dict
循环术语,并使用带有默认值的
get
更新计数:

tf = {}
for t in terms:
    tf[t] = tf.get(t, 0) + 1

你所说的“最瘦”是指速度最快,还是代码最少?还是别的?用最少的语法。谢谢你,你说的多集到底是什么意思?这对手头的任务有什么意义。一堆单重多集?您仍然必须迭代才能计数的单个多集?您所说的“leanest”是指最快的还是最少的代码?还是别的?用最少的语法。谢谢你,你说的多集到底是什么意思?这对手头的任务有什么意义。一堆单重多集?一个你仍然需要迭代计算的多集?这是使用字典tho right?,而不是包。multi-set.import multiset,Pycharm似乎不喜欢这样。@SyntaxKiller错误消息具体是什么?很抱歉,现在是这样,有点不合适,这是在使用字典tho-right?,不是一个包。multi-set.import multiset,Pycharm似乎不喜欢这样。@SyntaxKiller错误消息具体是什么?很抱歉,现在是这样,有点不合适,