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','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 次传递中完成相同的操作。

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


为了更接近 Counter 可以做什么

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,'forever': {'gone': 1.0}}