如何有效地计算词典列表中每个键的出现次数?

时间:2016-11-07 15:42:46

标签: python list numpy dictionary

我想计算每个令牌的正/负文档频率的出现次数。但是我的python脚本整个上午都在运行并运行。你能告诉我什么问题吗?提前感谢。

import numpy as np
positive_feature=[[{'a':2,'b':1},1],
                  [{'b':2,'c':1},1]
                 ]

negative_feature=[[{'e':2,'b':1},0]
                 ]
alltokens=['a','b','c','e']

dic=dict((t,i) for i,t in enumerate(alltokens))

vacabulary_size=len(dic)

positive_doc_frequency,negative_doc_frequency=np.zeros(vacabulary_size), np.zeros(vacabulary_size)

for t in alltokens:
    for x in positive_feature:
        if t in x[0].keys():
            positive_doc_frequency[dic[t]]+=1
    for x in negative_feature:
        if t in x[0].keys():
            negative_doc_frequency[dic[t]]+=1

根据alltokens列表的元素顺序,我想对positive_doc_frequency / negative_doc_frequency如下:

alltokens=['a','b','c','e']
positive_doc_frequency=[1,2,1,0]
negative_doc_frequency=[0,1,0,1] 

但是python脚本现在仍然在运行(从早上8点到下午4点),我的脚本是否有任何优化?再次感谢。

更新 由于样本数据不佳,这个问题具有误导性。让我纠正一下。

输入:

alltokens=['a','b','c','e']
positive_feature=[[{'a':aa,'b':bb},1],
                  [{'b':vv,'c':cc},1]
                 ]

negative_feature=[[{'e':ee,'b':bb},0]
                 ]

我想要的输出是:

positive_doc_frequency=[1,2,1,0]
negative_doc_frequency=[0,1,0,1] 
positive_doc_frequency列表中的<1,2> 1,2,1,0代表&#39; a&#39;在positive_feature列表中出现一次,&#39; b&#39;发生两次,&#39; c&#39;发生一次,&#39; e&#39;在positive_feature列表中发生零次。

2 个答案:

答案 0 :(得分:0)

from itertools import chain
from collections import Counter
c = Counter(chain.from_iterable(d for d, x in positive_feature))
print(*sorted(c.items()))

这将列出positive_feature中的所有键,然后计算每个键的数量,然后打印计数。

要获得您想要的计数,请执行

pos_freq = [c[key] for key in alltokens]

答案 1 :(得分:0)

我不确定为什么你的代码会在那么长的时间内运行,即使数据集很大。

Python中count occurrences of things的方法有很多种。我performance tested使用了一些不同的技术,发现标准库中的collections.Counter是最快的方法(因为它仅针对此用例进行了优化,因此毫不奇怪)。

在您的代码中使用collections.Counter看起来像这样:

from collections import Counter

positive_doc_frequency = Counter()
negative_doc_frequency = Counter()

for t in alltokens:
    for x in positive_feature:
        positive_doc_frequency.update(x[0].keys())
    for x in negative_feature:
        negative_doc_frequency.update(x[0].keys())