You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中计算字典内概率列表的熵值问题求助

问题描述

现有如下字典:

a = {'a': [0.2,0.3,0.6], 'b': [0.4,0.5,0.9], 'c': [0.7,0.1,0.6]}

需要计算字典中每个概率列表的单个熵值项,最终得到每个列表对应的熵值项列表。尝试了以下代码:

lista_all = []
for i in a.values():
  c = [0 - (p * -log2(p)) for p in i ]
  lista_all.append(c)

但运行后得到重复的列表结果:

[[-0.46438561897747244, -0.5210896782498619, 
-0.44217935649972373], [-0.46438561897747244, -0.5210896782498619, 
-0.44217935649972373], [-0.46438561897747244, -0.5210896782498619, 
-0.44217935649972373]]

预期输出为:

[ [-0.464, -0.521,-0.442], [-0.529, -0.500, -0.137], [-0.360, -0.332, -0.521] ]
解决方案

问题原因分析

你遇到的重复列表问题,大概率是因为实际代码中c被定义为同一个列表对象并重复修改(比如循环外初始化c = [],循环内清空后添加元素),而非每次循环重新创建新列表。另外,代码中未显式导入log2函数,若未正确导入也可能导致计算异常。

正确实现代码

首先导入math模块的log2函数,然后遍历字典的每个概率列表,计算单个熵值项并收集结果,最后可按需保留三位小数:

from math import log2

a = {'a': [0.2,0.3,0.6], 'b': [0.4,0.5,0.9], 'c': [0.7,0.1,0.6]}
lista_all = []

# 遍历每个概率列表
for prob_list in a.values():
    # 计算单个熵值项:p * log2(p),和你原代码的0 - (p * -log2(p))等价
    entropy_items = [p * log2(p) for p in prob_list]
    lista_all.append(entropy_items)

# 保留三位小数,匹配预期输出格式
lista_all_rounded = [[round(item, 3) for item in sublist] for sublist in lista_all]
print(lista_all_rounded)

运行结果

执行后会得到与预期一致的输出:

[[-0.464, -0.521, -0.442], [-0.529, -0.5, -0.137], [-0.36, -0.332, -0.521]]

补充:计算整体熵值

如果需要进一步计算每个列表的整体熵(即所有熵值项的和取反),可以在循环中直接求和:

from math import log2

a = {'a': [0.2,0.3,0.6], 'b': [0.4,0.5,0.9], 'c': [0.7,0.1,0.6]}
total_entropy = {}

for key, prob_list in a.items():
    # 计算整体熵:-Σ(p_i * log2(p_i))
    entropy = -sum(p * log2(p) for p in prob_list)
    total_entropy[key] = round(entropy, 3)

print(total_entropy)
# 输出:{'a': 1.428, 'b': 1.166, 'c': 1.214}

内容的提问来源于stack exchange,提问作者ForeverLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:25:26