将有序数据放回字典中
Put ordered data back into a dictionary
我有一个(正常的,无序的)字典来保存我的数据,我将一些数据提取到一个 numpy 数组中来做一些线性代数。完成后,我想将生成的有序 numpy 矢量数据与所有数据一起放回字典中。最好的、最 Pythonic 的方法是什么?
Joe Kington suggests in his answer to "Writing to numpy array from dictionary"认为两种解决方案包括:
- 使用Ordered Dictionaries
- 将排序顺序存储在另一个数据结构中,例如字典
以下是一些(可能有用的)详细信息:
我的数据在嵌套字典中。外部用于组:{groupKey: groupDict} 和组键从 0 开始并按组总数计数。 groupDict 包含有关项目的信息:(itemKey: itemDict}。itemDict 具有实际数据的键,这些键通常从 0 开始,但可以跳过数字,因为并非所有 "item locations" 都被填充。itemDict 键包括诸如 'name'、'description'、'x'、'y'、...
获取数据很容易,字典很棒:
数据[groupKey][itemKey]['x'] = 0.12
然后我将 x 和 y 等数据放入 numpy 向量和数组中,如下所示:
xVector = numpy.empty( xLength )
vectorIndex = 0
for groupKey, groupDict in dataDict.items()
for itemKey, itemDict in groupDict.items()
xVector[vectorIndex] = itemDict['x']
vectorIndex += 1
然后我开始做我的线性代数并计算我想添加回 dataDict 的 z 向量。问题是 dataDict 是无序的,所以我没有办法获得正确的索引。
Ordered Dict 方法可以让我知道顺序,然后通过 dataDict 结构进行索引并将数据放回。
或者,我可以在上面的内部 for 循环中创建另一个字典,它存储 vectorIndex、groupKey 和 itemKey 之间的关系:
sortingDict[vectorIndex]['groupKey'] = groupKey
sortingDict[vectorIndex]['itemKey'] = itemKey
稍后,当需要放回数据时,我可以循环遍历向量并添加数据:
vectorIndex = 0
for z in numpy.nditer(zVector):
dataDict[sortingDict[vectorIndex]['groupKey']][sortingDict[vectorIndex]['itemKey']]['z'] = z
这两种方法对我来说似乎同样直接。我不确定将 dataDict 更改为有序字典是否会对我的代码中的其他地方产生任何其他影响,但可能不会。添加排序字典似乎也很容易,因为它将与 numpy 数组和向量同时创建。独自一人,我想我会使用 sortingDict 方法。
这些方法中有一种比其他方法好吗?有没有更好的方法我没有想到?我的数据结构对我来说效果很好,但如果有办法改变它以改进其他一切,我愿意接受。
我最终选择了选项 #2,效果很好。
我有一个(正常的,无序的)字典来保存我的数据,我将一些数据提取到一个 numpy 数组中来做一些线性代数。完成后,我想将生成的有序 numpy 矢量数据与所有数据一起放回字典中。最好的、最 Pythonic 的方法是什么?
Joe Kington suggests in his answer to "Writing to numpy array from dictionary"认为两种解决方案包括:
- 使用Ordered Dictionaries
- 将排序顺序存储在另一个数据结构中,例如字典
以下是一些(可能有用的)详细信息:
我的数据在嵌套字典中。外部用于组:{groupKey: groupDict} 和组键从 0 开始并按组总数计数。 groupDict 包含有关项目的信息:(itemKey: itemDict}。itemDict 具有实际数据的键,这些键通常从 0 开始,但可以跳过数字,因为并非所有 "item locations" 都被填充。itemDict 键包括诸如 'name'、'description'、'x'、'y'、...
获取数据很容易,字典很棒: 数据[groupKey][itemKey]['x'] = 0.12
然后我将 x 和 y 等数据放入 numpy 向量和数组中,如下所示:
xVector = numpy.empty( xLength )
vectorIndex = 0
for groupKey, groupDict in dataDict.items()
for itemKey, itemDict in groupDict.items()
xVector[vectorIndex] = itemDict['x']
vectorIndex += 1
然后我开始做我的线性代数并计算我想添加回 dataDict 的 z 向量。问题是 dataDict 是无序的,所以我没有办法获得正确的索引。
Ordered Dict 方法可以让我知道顺序,然后通过 dataDict 结构进行索引并将数据放回。
或者,我可以在上面的内部 for 循环中创建另一个字典,它存储 vectorIndex、groupKey 和 itemKey 之间的关系:
sortingDict[vectorIndex]['groupKey'] = groupKey
sortingDict[vectorIndex]['itemKey'] = itemKey
稍后,当需要放回数据时,我可以循环遍历向量并添加数据:
vectorIndex = 0
for z in numpy.nditer(zVector):
dataDict[sortingDict[vectorIndex]['groupKey']][sortingDict[vectorIndex]['itemKey']]['z'] = z
这两种方法对我来说似乎同样直接。我不确定将 dataDict 更改为有序字典是否会对我的代码中的其他地方产生任何其他影响,但可能不会。添加排序字典似乎也很容易,因为它将与 numpy 数组和向量同时创建。独自一人,我想我会使用 sortingDict 方法。
这些方法中有一种比其他方法好吗?有没有更好的方法我没有想到?我的数据结构对我来说效果很好,但如果有办法改变它以改进其他一切,我愿意接受。
我最终选择了选项 #2,效果很好。