【发布时间】:2016-01-21 14:55:29
【问题描述】:
我有以下数据结构(带有示例数据):
edgeID (unique key) | timeStep (ordering key, | value
| can have multiple occurrences) |
-----------------------------------------------------------------
"edge1" | 15 | 12.1
"edge3" | 18 | 17.32
"edge2" | 23 | 15.1
"edge5" | 23 | 65.6
我希望能够在这个结构上高效地执行以下任务:
- 添加一个
timeStep高于任何其他已存储timeStep的新数据条目。如果达到maxNumber的数据条目(例如20),则应删除具有最低timeStep的数据条目。 - 合并两个数据集,保持
maxNumber的数据条目(例如 20 个)最高timeStep条目)。
如何在python中实现这个数据结构?
我尝试了一种可行的方法:
-
一个存储数据的dict,一个SortedSet根据排序键存储键:
data = {} dataOrder = SortedSet(key=lambda x: data[x][0]) maxDataSize = 20 def addData(edgeID, dataTuple): if(len(data) >= maxDataSize): # remove oldest value key = dataOrder.pop(0) del data[key] # add data[edgeID] = dataTuple dataOrder.add(edgeID) addData("edge1", (15, 12.1))这种方法的缺点是我将
edgeID存储了两次,而且我总是必须更新这两个数据结构。
我尝试了一种不起作用的方法:
-
只有一个SortedSet,它存储了整个数据并根据排序键进行排序:
data = SortedSet(key=lambda x: x[1]) maxDataSize = 20 def addData(dataTuple): if(len(self.data) >= self.maxDataSize): # remove oldest value data.pop(0) # add data.add(dataTuple) addData(("edge1", 15, 12.1))这种方法不起作用的事实是,它让我输入相同的
edgeID两次,但使用不同的timeSteps,因为(我认为)它会散列整个元组而不仅仅是edgeID。不幸的是,我无法在OrderedSet构造函数中定义散列函数。这引出了我认为必须可行的第三种方法: 我可以定义一个实现
__hash__()函数的类,而不是使用元组作为数据条目,它只会返回edgeID。然后我可以将此类的对象存储在OrderedSet
这第三种方法真的是最好的吗?你有什么建议?
【问题讨论】:
标签: python sorting data-structures hash set