多维词典理解

Multidimensional dictionary comprehension

假设我有这样的字典:

d = {key1: [1,2,3], key2: [4,6,7]}

如果我想要一个字典,从值中减去相应数组的平均值,我可以这样做:

new_d = {key: x - np.mean(x) for (key,x) in d.items()}

现在说我的字典实际上是这样的:

d = {key1: [[1,2,3], [10,100,1000]], key2: [[4,5,6], [11,12,16]]}

在这种情况下字典理解如何工作?

结果应如下所示:

new_d = {key1: [[-1, 0, 1], [-360, -270, 630]], key2: [[-1, 0, 1], [-2, -1, 3]]}

感谢您的帮助!

根据您的一维解决方案,您只需要一个嵌套列表理解:

>>> {key: [y-np.mean(y) for y in x] for key,x in d.items()}
{'key1': [array([-1.,  0.,  1.]), array([-360., -270.,  630.])],
 'key2': [array([-1.,  0.,  1.]), array([-2., -1.,  3.])]}

但是如果您想要完全您使用惯用的 NumPy 编写的输出,则有点不同:

  1. 指定 int 数据类型
  2. 取各行的平均值
  3. Convert back to list
>>> {key: (x - np.mean(x, axis=1, keepdims=True, dtype='int')).tolist()
...  for key,x in d.items()}
{'key1': [[-1, 0, 1], [-360, -270, 630]],
 'key2': [[-1, 0, 1], [-2, -1, 3]]}

使用与您相同的理解方式,为子列表增加一级:

new_d = {key: [x - np.mean(x) for x in l] for (key,l) in d.items()}

如列表:

{key: [(x - np.mean(x)).tolist() for x in l] for (key,l) in d.items()}

输出:

{'key1': [[-1.0, 0.0, 1.0], [-360.0, -270.0, 630.0]],
 'key2': [[-1.0, 0.0, 1.0], [-2.0, -1.0, 3.0]]}