python – 使用不同的哈希和排序键的有序元组
我有以下数据结构(带有示例数据):
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的数据条目. 如何在python中实现这个数据结构? 我尝试过一种有效的方法: >一个存储数据的字典,一个根据排序键存储密钥的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)) 这种方法不起作用的事实是它允许我使用不同的timeSteps两次输入相同的edgeID,因为(我认为)它会散列整个元组而不仅仅是edgeID.不幸的是,我无法在OrderedSet构造函数中定义哈希函数.这导致我采用我认为必须工作的第三种方法: 第三种方法真的是最好的吗?你有什么建议? 解决方法
你想要的是一个heapq,在timeStep上排序.
抬头:https://docs.python.org/2/library/heapq.html 从本质上讲,python的堆是一个最小堆,因此最小的时间步长将存储在堆的顶部,并且可以在O(1)中获取. 您可以使用另一个dict协调它,以便根据您喜欢的特定键快速获取其他剩余条目 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |