首页 > 解决方案 > 将每个键的值作为数组存储在字典中

问题描述

我想规范化字典中的所有值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,虽然它包含一个零值,如果它是键,有没有更好的解决方案来规范它,因为我认为我的解决方案效率不高!

PS:我尝试在 for 循环的末尾norm[k]= np.array(values)而不是, norm[k]=values但结果不符合要求。

标签: pythonarrayspython-3.xdictionaryfor-loop

解决方案


append如上所述,将一个元素添加到列表中,并且该元素可以是一个列表,这就是为什么您当前在列表中有一个列表。理想情况下,您应该使用extendwhich 将第一个列表与另一个列表连接起来。


推荐阅读