Python 将每个键的值作为数组存储在字典中
我想规范化dictionaryPython 将每个键的值作为数组存储在字典中,python,arrays,python-3.x,dictionary,for-loop,Python,Arrays,Python 3.x,Dictionary,For Loop,我想规范化dictionarydata中的所有值,并使用相同的键将它们再次存储在另一个dictionary中,对于每个键,值都应存储在1D数组中,因此我执行了以下操作: >>> data = {1: [0.6065306597126334], 2: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 3: [0.6065306597126334, 0.6065306597126334, 0.13533528
data
中的所有值,并使用相同的键将它们再次存储在另一个dictionary中,对于每个键,值都应存储在1D数组中,因此我执行了以下操作:
>>> 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]}
现在假设字典数据
只包含其一个键的零值,就像第一个键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语句来解决这个问题,但是我不能将每个键的值存储为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]}
另外,对于dictionarydata
,虽然它包含一个零值(如果它是键),但是有没有更好的解决方案来规范它,因为我认为我的解决方案效率不高
附言:我在for循环的末尾尝试了norm[k]=np.array(values)
而不是norm[k]=values
,但结果不是必需的。append
如上所述,将元素添加到列表中,并且该元素可以是列表,这就是为什么您当前在列表中有一个列表的原因。理想情况下,您应该使用将第一个列表与另一个列表连接起来的extend
。如回答中所述,extend
可用于解决您的问题。如果确实要使用append
,则可以使用列表中的第一个元素
norm = {}
for k, vals in data.items():
values = []
if sum(vals) == 0:
values.append(vals[0])
else:
for v in vals:
values.append([v / sum(vals)][0])
norm[k] = values
请参阅,以获取追加与扩展的示例
至于优化。完全删除for循环是不可能的,但您可以缩短解决方案,同时保持可读性:
norm = {}
for k, vals in data.items():
if sum(vals) == 0:
norm[k] = vals
else:
norm[k] = [x / sum(vals) for x in vals]
当总和(VAL)==0时,您的听写/列表理解失败:
>>> data = {1: [0.0], 2: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 3: [0.6065306597126334, 0.6065306597126334, 0.1353352832366127], 4: [0.6065306597126334, 0.6065306597126334]}
>>> {k: [v / sum(vals) for v in vals] for k, vals in data.items()}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
File "<stdin>", line 1, in <listcomp>
ZeroDivisionError: float division by zero
如果要避免多次求值sum(VAL)
:
>>> {k: [v / s if s!=0 else 1.0 for v in vals] for k,vals,s in ((k, vals, sum(vals)) for k, vals in data.items())}
{1: [1.0], 2: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 3: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 4: [0.5, 0.5]}
((k,vals,sum(vals))表示数据中的k,vals.items())
是一个生成器,它为每个项目返回k
、vals
和sum(vals)
。将附加更改为扩展。另外,无需根据扩展内容创建列表,它已经是一个列表了。谢谢您的帮助。有没有更有效的方法来获取这本字典,而不是所有这些循环?@Noah16我已经更新了我的答案。如果我的回答能解决你的问题,请投票并接受。
>>> {k: [v / s if s!=0 else 1.0 for v in vals] for k,vals,s in ((k, vals, sum(vals)) for k, vals in data.items())}
{1: [1.0], 2: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 3: [0.4498162176582741, 0.4498162176582741, 0.10036756468345168], 4: [0.5, 0.5]}