以字典形式访问字典

时间:2011-06-21 19:34:59

标签: python data-structures pyqt4

我有一个最好使用字典建模的数据源( 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,其中底层数据容器是一个字典。

感谢。

4 个答案:

答案 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]获取您想要的密钥和值的访问权限。