Esc*_*alo 5 python pyqt4 data-structures
我有一个数据源,最好用字典建模(它是key = value对的集合).对于特定的可视化目的,我需要提供类似列表的数据访问接口(除了常规字典界面),这意味着您应该能够执行以下操作:
data["mykey"] # returns the associated value
data[12][0] # returns the 13th key in the dictionary
data[12][1] # returns the 13th value in the dictionary
Run Code Online (Sandbox Code Playgroud)
我找不到合适的Facade实现 - 如果我将索引存储为字典键:
data[12] = ("mykey", "myval")
Run Code Online (Sandbox Code Playgroud)
我可以很容易地解决最后两种情况,但我放弃了做第一种情况的能力.如果我存储数据
data["mykey"] = "myval"
Run Code Online (Sandbox Code Playgroud)
在返回元素之前,我必须枚举临时列表中的所有键和值.
请注意,所有这些实现都假设我使用的是OrderedDict.
你会如何提供这两种接口?
如果你很好奇,那就是创建一个PyQt QAbstractTableModel,其中底层数据容器是一个字典.
谢谢.
我必须做同样的事情来表示 ListCtrl 中的数据,这些数据有时需要通过键而不是索引来访问(这样,如果我获得任意值来定位,则不必搜索它)。如果您有一个字典列表,我发现最好的方法是创建另一个字典,其中引用相同的项目,但可以通过键访问。这成为我的数据加载方法:
def SetData(self, cols, data):
for idx, row in enumerate(data):
item = dict((k, v.rstrip() if hasattr(v, 'rstrip') else v) for k, v in zip(cols, row))
self.data[idx] = item
self.byid[row[0]] = item
Run Code Online (Sandbox Code Playgroud)
因此,我在 self.data 中有一个可访问的字典列表,然后在 self.byid 中有另一个字典,它保留相同的项目,但通过 id 列(在本例中为我的行中的第 0 列)。当我需要更新的时候,只要我拿到一个ID,我就可以打电话self.byid[id][field] = newval。因为Python中的一切都是指针(引用),所以改变存储在self.byid中的字典的值会反映在存储在self.data中的字典列表中。奇迹般有效。