将有序数据放回字典

时间:2017-10-13 18:43:29

标签: python python-3.x numpy dictionary ordereddictionary

我有一个(正常的,无序的)字典,它保存着我的数据,我将一些数据提取到一个numpy数组中来做一些线性代数。一旦完成,我想将生成的有序numpy向量数据放回到包含所有数据的字典中。什么是最好的,最Pythonic的方式呢?

Joe Kington suggests in his answer to "Writing to numpy array from dictionary"两个解决方案包括:

  1. 使用Ordered Dictionaries
  2. 将排序顺序存储在另一个数据结构中,例如字典
  3. 以下是一些(可能有用的)细节:

    我的数据是嵌套词典。外部用于组:{groupKey:groupDict}和组键从0开始并按组计算总数。 groupDict包含有关项目的信息:(itemKey:itemDict).itemDict具有实际数据的键,这些键通常从0开始,但可以跳过数字,因为并非所有“项目位置”都被填充.itemDict键包括“name”之类的内容, 'description','x','y',...

    获取数据很简单,字典很棒: data [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方法。

    这些方法中的一种比其他方法更好吗?有没有更好的方式我没想到?我的数据结构对我来说效果很好,但是如果有办法改变它以改进其他一切,我会对它开放。

1 个答案:

答案 0 :(得分:0)

我最终选择了选项#2,并且效果很好。