2017-03-29 127 views
0

我想计算字典中值的出现百分比。 d.values/sum(d.values)*100它给出了错误:unsupported operand type(s) for /: 'list' and 'int'你不能用整数分割整个列表。我想,并且我在计数的时候用d =(Counter([Counter(i)['1'] for i in f.readlines()]))进行了尝试,您可以计算百分比,但它不起作用。如果有人有想法,请让我知道。计算python字典的百分比

from collections import Counter 
import numpy as np 
import matplotlib.pyplot as plt 
import pylab as pl 
with open("data_binary.txt") as f: 
    d=(Counter([Counter(i)['1'] for i in f.readlines()])) 
    print d 

    p = d.values() 
    X = np.arange(len(d)) 
    pl.bar(X, p, align='center',width=0.25) 
    a = np.array(d.items()) 
    pl.xticks(X,d.keys()) 
    a = a[np.argsort(a[:,0])] 
    #print a 
    ymax=max(d.values())+1 
    pl.ylim(0, 70000) 
    plt.xlabel ("Number of ones") 
    plt.ylabel ("Number of Signatures") 
    plt.title("[email protected]") 
    pl.show() 
+0

可以给你一个例如。字典是怎么样的? – AceLearn

+0

为什么不直接使用'np.fromfile'(如果是二进制)或'np.loadtxt'将数据直接加载到'np.array'? – Crispin

回答

0

您可能想使用len(d.values())来获取项目的数量,除非我失去了一些东西。你能分享一下字典(d)的样子吗? (即打印d?的输出)

0

你可以使用list comp。

In[2]: my_dict = {key: key for key in range(5)} 
In[3]: values = my_dict.values() 
In[4]: values 
Out[4]: [0, 1, 2, 3, 4] 
In[5]: total = sum(values) 
In[6]: new = [value * 100./total for value in values] 
In[7]: new 
Out[7]: [0.0, 10.0, 20.0, 30.0, 40.0] 

,或者您可以使用np.array

In[8]: import numpy as np 
In[9]: x = np.array([1, 2, 3, 4]) 
In[10]: x 
Out[10]: array([1, 2, 3, 4]) 
In[11]: x/3.4 
Out[11]: array([ 0.29411765, 0.58823529, 0.88235294, 1.17647059]) 
0

使用numpy的

x = np.array(d.values()) 
print x*100.0/sum(x) 
0

对于任何字典d,其值是整数,总的由每个项目所代表的百分比计算和打印如下:

s = sum(d.values()) 
for k, v in d.items(): 
    pct = v * 100.0/s 
    print(k, pct) 

numpy对此是过度的,它针对数组而不是字典进行了优化。