我有一个存储在树中每个节点的5个文档的文档列表。在每个列表中都有许多单词可以在同一文档和其他文档中重复多次。我想计算一下每个单词的应用文件数量。 例如:A是父节点,B,C是子节点。 A,B,C有5个文件。
A=[['a','b'],['a','a'],['c','d'],['a','c'],['d','e']]
我希望结果采用{'a':3,'b':1,'c':2,'d':2,'e':1}
下面是我正在使用的代码,但它不是对每个文档进行计数,而是计算每个单词出现在文档中的次数。
def get_count(node):
word_count_dict = defaultdict(int)
next_node=[]
for i in range(len(node.documents)):
for words in node.documents[i]:
word_count_dict[words] +=1
node.word_count = word_count_dict
for child in node.children:
next_node.append(child)
if next_node:
for nn in next_node:
get_count(nn)
return word_count_dict
get_count(A)
请帮助如何做到这一点。
答案 0 :(得分:1)
内置包。但应该有一个简单的方法。
from itertools import chain
from collections import Counter
dict(Counter(chain.from_iterable(set(l) for l in A)))
#{'a': 3, 'b': 1, 'c': 2, 'd': 2, 'e': 1}
答案 1 :(得分:1)
你打电话给孩子们get_count
,但不要分配结果或做任何事情
根据我的理解,您需要set
和Counter
。
假设node.documents
和node.children
是可迭代的(它们应该是),这可以起作用
from collections import Counter
from itertools import chain
def get_count(node):
words_per_document = map(set, node.documents)
word_count = Counter(chain.from_iterable(words_per_document))
for child in node.children:
word_count += get_count(child)
return word_count
我认为没有理由设置队列