Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将每个键的值作为数组存储在字典中_Python_Arrays_Python 3.x_Dictionary_For Loop - Fatal编程技术网

Python 将每个键的值作为数组存储在字典中

Python 将每个键的值作为数组存储在字典中,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

我想规范化dictionary
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]}
另外,对于dictionary
data
,虽然它包含一个零值(如果它是键),但是有没有更好的解决方案来规范它,因为我认为我的解决方案效率不高


附言:我在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]}