我有一个最好使用字典建模的数据源(是 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
我找不到合适的Facade实现 - 如果我将索引存储为字典键:
data[12] = ("mykey", "myval")
我可以很容易地解决最后两种情况,但我放弃了做第一种情况的能力。如果我存储像
这样的数据data["mykey"] = "myval"
在返回元素之前,我必须枚举临时列表中的所有键和值。
请注意,所有这些实现都假设我使用的是OrderedDict
。
您如何提供这两种界面?
如果您感到好奇,那就是创建一个PyQt QAbstractTableModel
,其中底层数据容器是一个字典。
感谢。
答案 0 :(得分:3)
我必须做同样的事情来表示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
所以我有一个可在self.data中访问的字典列表,然后是self.byid中的另一个字典,它保存相同的项目,但是由id列(在这种情况下我的行中的第0列)。当我需要更新时,只要我收到ID,我就可以拨打self.byid[id][field] = newval
。因为Python中的所有内容都是指针(引用),所以更改self.byid中存储的字典的值会反映在self.data中存储的字典列表中。像魅力一样。
答案 1 :(得分:1)
list(data.items())[12]
将为(key, value)
中的第13个键值对返回OrderedDict
元组。 list(data.keys())[12]
将自行返回第13个密钥,list(data.values())[12]
将返回第13个值。
这可能不适合大型dict
,因为每次都会重新创建列表。
(但是,OrderedDict
方法中__repr__
使用的方法非常相同:return '%s(%r)' % (self.__class__.__name__, list(self.items()))
)
答案 2 :(得分:0)
尝试基于索引的密钥访问但是故障转移到默认密钥访问的dict
子类可以完成这项工作。有点像:
from collections import OrderedDict
class IndexableDict(OrderedDict):
def __getitem__(self, key):
"""Attempt to return based on index, else try key"""
try:
_key = self.keys()[key]
return (_key, super(IndexableDict, self).__getitem__(_key))
except (IndexError, TypeError):
return super(IndexableDict, self).__getitem__(key)
d = IndexableDict(spam='eggs', messiah=False)
d['messiah'] ## False
d[1] ## ('messiah', False)
d[0] ## ('spam', 'eggs')
编辑:如果您使用整数作为键,则会中断。
答案 3 :(得分:0)
拿你的dict {}并创建另一个键,其中键是标记,值是原始字典的键,或原始字典中的元组/列表。
d = {"key1":"value1","key2":"value2","key3":"value3"}
d2 = {1:"key1",2:"key2",3:"key3"}
然后:
d[d2[3]]
返回
'value3'
或使用以下内容定义d2:
d2 = {1:["key1","value1"],2:["key2","value2"],3:["key3","value3"]}
分别使用d2 [3] [0]和d2 [3] [1]获取您想要的密钥和值的访问权限。