Python 广播/迭代字典值的有效方法

Python 广播/迭代字典值的有效方法,python,numpy,dictionary,Python,Numpy,Dictionary,我正在尝试在以下计算中使用字典值: mydict = dict(zip(['key1', 'key2', 'key3'], [1, 2, 3])) print(mydict) newvals = (mydict.values() + 3) ** 2 print(newvals) {'key1':1,'key2':2,'key3':3} TypeError:不支持+:“dict_values”和“int”的操作数类型 或者如果我这样做了 将numpy导入为

我正在尝试在以下计算中使用字典值:

mydict = dict(zip(['key1', 'key2', 'key3'],
                  [1, 2, 3]))
print(mydict)

newvals = (mydict.values() + 3) ** 2
print(newvals)
{'key1':1,'key2':2,'key3':3}
TypeError:不支持+:“dict_values”和“int”的操作数类型
或者如果我这样做了

将numpy导入为np
newvals=(np.array(mydict.values())+3)**2
打印(newvals)
似乎我必须首先将字典值转换为列表,或者使用列表进行迭代

newvals=(np.array(list(mydict.values())+3)**2
打印(newvals)
或者我可以

newvals=np.array([(val+3)**2表示mydict.values()中的val)
打印(newvals)
[16 25 36]
有没有更简单或更有效的方法来做到这一点? 或者,是否有一种内置的字典方法可以使用,这样我就不必使用列表理解或for循环


谢谢。

这应该能帮你解决问题

for key, value in mydict.items():
    mydict[key] = (value + 3) ** 2

这应该能帮你解决问题

for key, value in mydict.items():
    mydict[key] = (value + 3) ** 2
这样你就进入了e。g 1触摸“按键1”。1 + 3 ** 2. 键1的第一个值:16


这样你就进入了e。g 1触摸“按键1”。1 + 3 ** 2. 键1:16的第一个值当我们在
numpy
中谈论避免循环时,我们实际上的意思是避免Python级别的循环。我们仍然需要遍历数组元素,但我们使用快速编译的代码来完成。该代码仅适用于
numpy
ndarrays
。此外,通过数组的循环比通过列表的循环更糟糕

如果我们从列表开始,我们必须首先将其转换为
ndarray
,例如
arr=np.array([1,2,3])
。数组转换需要时间,所以通常可以更快地理解列表

numpy
没有任何代码可以直接使用Python
dicts
<代码>值()生成类似生成器的对象<代码>np。数组(…)需要类似列表的对象:

In [140]: np.array(list(mydict.values()))                                                      
Out[140]: array([1, 2, 3])
In [141]: (np.array(list(mydict.values())) +3)**2                                              
Out[141]: array([16, 25, 36])
fromiter
可以从
对象工作:

In [142]: np.fromiter(mydict.values(), int)                                                    
Out[142]: array([1, 2, 3])
np.fromiter
可能比
np.array
快,但我不能保证

我怀疑列表理解速度更快,尤其是对于这个小例子:

In [143]: [(x+3)**2 for x in mydict.values()]                                                  
Out[143]: [16, 25, 36]
我们可以做一些时间测试,但对于这个小样本来说,它可能不会那么有用


字典在很多方面都很有用,但快速数值计算并不是其中之一。

当我们在
numpy
中谈到避免循环时,我们实际上的意思是避免Python级别的循环。我们仍然需要遍历数组元素,但我们使用快速编译的代码来完成。该代码仅适用于
numpy
ndarrays
。此外,通过数组的循环比通过列表的循环更糟糕

如果我们从列表开始,我们必须首先将其转换为
ndarray
,例如
arr=np.array([1,2,3])
。数组转换需要时间,所以通常可以更快地理解列表

numpy
没有任何代码可以直接使用Python
dicts
<代码>值()生成类似生成器的对象<代码>np。数组(…)需要类似列表的对象:

In [140]: np.array(list(mydict.values()))                                                      
Out[140]: array([1, 2, 3])
In [141]: (np.array(list(mydict.values())) +3)**2                                              
Out[141]: array([16, 25, 36])
fromiter
可以从
对象工作:

In [142]: np.fromiter(mydict.values(), int)                                                    
Out[142]: array([1, 2, 3])
np.fromiter
可能比
np.array
快,但我不能保证

我怀疑列表理解速度更快,尤其是对于这个小例子:

In [143]: [(x+3)**2 for x in mydict.values()]                                                  
Out[143]: [16, 25, 36]
我们可以做一些时间测试,但对于这个小样本来说,它可能不会那么有用


字典对很多事情都很有用,但快速数值计算不是其中之一。

谢谢。但最好不要用于循环或列表理解。也许没有更好的办法了,谢谢。但最好不要用于循环或列表理解。可能没有更好的方法。如果您想不使用循环,您必须使用共享内存数据结构的并行处理(如标准库中的多处理库中提供的),或者使用类似numpy的库,该库是用c和Fortran编写的,专门为此任务设计的。使用vanilla Python字典或列表进行单线程处理对于许多任务来说都是很好的,但是对于没有循环的快速并行计算来说,这是错误的。如果您想在没有循环的情况下进行此操作,您必须使用具有共享内存数据结构的并行处理(如标准库中的多处理库中提供的)或类似numpy的库,该库是用c和Fortran编写的,专门为此任务设计的。使用普通Python字典或列表进行单线程处理对于许多任务来说都很好,但对于没有循环的快速并行计算来说,这是错误的方法。