如何解决以列表形式访问字典
| 我有一个最好用字典建模的数据源(它是键=值对的集合)。为了实现特定的可视化目的,我需要提供一个类似于列表的数据访问接口(除了常规词典接口之外),这意味着您应该能够执行以下操作: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
。
您将如何提供这两个接口?
如果您好奇,这是为了创建一个PyQtQAbstractTableModel
,其中基础数据容器是一个字典。
谢谢。
解决方法
我必须做同样的事情来表示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中存储的字典列表中。奇迹般有效。
, list(data.items())[12]
将为OrderedDict
中的第13个键值对返回(key,value)
元组。 list(data.keys())[12]
将自行返回第13个键,list(data.values())[12]
将返回第13个值。
但是,由于每次重新创建列表时,对于大的ѭ12来说,这可能不是一个好主意。
(但是,这与OrderedDict
在其ѭ14used方法中使用的方法非常相同:return \'%s(%r)\' % (self.__class__.__name__,list(self.items()))
)
, 以您的dict {}为例,创建另一个键,其键为索引,值要么为原始dict的键,要么为原始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]作为键和值,以获取所需的访问权限。
, 尝试基于索引的键访问但故障切换到默认键访问的fails12ѭ子类可以完成此工作。类似于以下内容:
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\')
编辑:如果您使用整数作为键,这将中断。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。