如何解决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}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。