python中列表字典上的概率



我有这个列表字典:

my_dict = {'Summer':['Summer','Summer','gone'],'gone':['forever'],'forever':['gone']}

我想要列表中每个单词作为字典的概率,在这种情况下,期望的字典是:

my_dict_probs = {'Summer':{'Summer':0.66,'gone':0.33}, 'gone':{'forever':1}, 'forever'{'Summer':1}

所以我尝试了这个:

prob_dict = {}
for k,v in my_dict.items():
prob_dict[k] = v/len(v)
prob_dict

我得到这个错误:TypeError: unsupported operand type(s) for /: 'list' and 'int'。我想我应该计算每个唯一的值,所以我的方法不起作用。求你了,你能帮我吗?

试试这个

my_dict = {'Summer':['Summer','Summer','gone'],'gone':['forever'],'forever':['gone']}
for v in my_dict:
my_dict[v]={j:round(my_dict[v].count(j)/len(my_dict[v]),2) for j in my_dict[v]}
print (my_dict)

对现有代码的最小更改:

my_dict = {'Summer':['Summer','Summer','gone'],'gone':['forever'],'forever':['gone']} 

prob_dict = {}
for k,v in my_dict.items():
prob_dict[k] = {}                 # create inner dict
for i in set(v):                  # for each element of the list, count it
prob_dict[k][i] = v.count(i) / len(v)
print(prob_dict)

输出:

{'Summer': {'Summer': 0.6666666666666666, 'gone': 0.3333333333333333}, 
'gone': {'forever': 1.0}, 
'forever': {'gone': 1.0}}

这不如使用Counter有效,因为它为每个唯一值迭代内部列表一次。无论内部列表有多长,Counter都会在1次传递中完成相同的操作。

但它不需要任何导入,并且对现有代码的修改最小。


为了更接近什么计数器,你可以做

prob_dict = {}
for k,v in my_dict.items():
prob_dict[k] = {}
partial = 1.0 / len(v)
for i in v:
prob_dict[k].setdefault(i,0)
prob_dict[k][i] += partial
print(prob_dict)

它现在只迭代内部列表一次,但现在您发现浮动值不准确。

使用itertools:中的Counter

from collections import Counter
for k, v in my_dict.items():
prob_dict[k] = {k1: v1 / len(v) for k1, v1 in Counter(v).items()}
>>> prob_dict
{'Summer': {'Summer': 0.6666666666666666, 'gone': 0.3333333333333333},
'gone': {'forever': 1.0},
'forever': {'gone': 1.0}}

最新更新