【发布时间】:2019-08-12 05:23:20
【问题描述】:
我想规范化字典 data 中的所有值,并将它们再次存储在具有相同键的另一个字典中,并且对于每个键,值应该存储在一维数组中,所以我做了以下操作:
>>> data = {1: [0.6065306597126334], 2: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 3: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 4: [0.6065306597126334, 0.6065306597126334]}
>>> norm = {k: [v / sum(vals) for v in vals] for k, vals in data.items()}
>>> norm
{1: [1], 2: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 3: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 4: [0.5, 0.5]}
现在假设字典 data 仅包含其中一个键的零值,例如第一个键 1 的值:
>>> data = {1: [0.0], 2: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 3: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 4: [0.6065306597126334, 0.6065306597126334]}
那么规范化这个字典的值将得到 [nan] 值,因为除以零
>>> norm = {k: [v / sum(vals) for v in vals] for k, vals in data.items()}
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
>>> norm
{1: [nan], 2: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 3: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 4: [0.5, 0.5]}
所以我插入了一个if statement 来解决这个问题,但我无法将每个键的值存储为 ID 数组
代码
>>> norm = {}
>>> for k, vals in data.items():
... values = []
... if sum(vals) == 0:
... values.append(list(vals))
... else:
... for v in vals:
... values.append(list([v/sum(vals)]))
... norm[k]=values
...
>>> norm
{1: [[1.0]], 2: [[0.4498162176582741], [0.4498162176582741], [0.10036756468345168]], 3: [[0.4498162176582741], [0.4498162176582741], [0.10036756468345168]], 4: [[0.5], [0.5]]}
我想将norm 字典设为
norm = {1: [1.0], 2: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 3: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 4: [0.5, 0.5]}
另外,对于字典data,虽然它包含一个零值,如果它是键,有没有更好的解决方案来规范它,因为我认为我的解决方案效率不高!
P.S:我在 for 循环的末尾尝试了 norm[k]= np.array(values) 而不是 norm[k]=values,但结果不符合要求。
【问题讨论】:
-
将您的
append都更改为extend。此外,无需从正在扩展的内容中创建list,它已经是一个列表
标签: python arrays python-3.x dictionary for-loop