这是python中这种数据结构的最佳方法?

时间:2011-02-22 12:11:58

标签: python data-structures

我在python中有以下情况: 我正在解析本体,我想跟踪本体的一些属性并构建具有以下特征的数据结构:

- 只需一个密钥即可访问每个值

- 该值将是另一个具有以下3个内容的键值数据结构:

'x':[]一个简单的列表

'y':[{'name':value,'type':value}]包含特定dictioanry键值的列表

'z':[{'name':value,'type':value}]包含特定字典键值的列表

根据以上所述的最终数据结构我是:

ontology={'': [{'y': {'type': '','name':''}}],'x':[],'z':[ {'type': '', 'name': ''}]}

最后我想要这个dinctionary的多个条目。我不想使用列表,因为索引将是一个整数,我想通过一个键索引我的数据。

我将在3个不同的for循环中填充此数据结构。

在第一个循环中,我将只用关键名称填写本体词典。我想的是:

    ontology['a']={'a': [{'y': {'type': '','name':''}}],'x':[],'z':[ {'type': '', 'name': ''}]}

但是这个东西是用'python'标准方式做的。有没有其他更方便的方法这样做,因为在我看来有些奇怪。

最后我会有这样的事情:

ontology['a']={'a':[{'y': {'type': '','name':''}}],'x':[],'z':[ {'type': '', 'name': ''}]}
ontology['b']={'b':[{'y': {'type': '','name':''}}],'x':[],'z':[ {'type': '', 'name': ''}]}
ontology['c']={'c':[{'y': {'type': '','name':''}}],'x':[],'z':[ {'type': '', 'name': ''}]}
ontology['d']={'d':[{'y': {'type': '','name':''}}],'x':[],'z':[ {'type': '', 'name': ''}]}

在基于键的第二个循环中,我将填充x:[]值,这本身就是另一个字典

在第三个for循环中,我将填充y和z键。

这对于这个数据结构来说这是一个很好的方法吗?我还想过使用Classes来使我的代码更加“结构化”,但我想我会使用更多的代码行

3 个答案:

答案 0 :(得分:8)

“代码行”可能不是优化的最佳指标。这看起来像是一个超出“词典和列表”解决方案的典型例子。我去过那里很多次了。使用类,它将允许您编写可理解的可维护代码,使用命名方法来操作数据结构。

这将使您可以灵活地隐藏和更改底层存储,而无需更改语义或调用者的数据视图。

答案 1 :(得分:1)

要“仅使用键名填写本体词典”:

ontology = {}.fromkeys('abcd',{})

ontology = dict( (k,{}) for k in 'abcd') 

然后,您将使用'a':[...] 项填充本体的每个项目 {} >'b':[...] 'c':[...]

但我认为没有兴趣将值本体['a'] ['a'] 写成包含一个唯一元素的列表,该元素是一个具有一个唯一项目的字典相同的键'y'

而不是写这个值'a':[{'y':{'type':'DSE','name':'JHG'}}] ,例如,你可以写下'a':('DSE','JHG')。知道这对夫妇的第一个元素('DSE','JHG')是一个类型,第二个是名字。

你也可以写'z':('QSZA','IUYOIU'),知道第一个==一个类型,第二个==一个名字。

所以本体论将是:

{'a': {'a':('DSE','JHG') , 'x':[...] , 'z':('QSZA','IUYOIU')} ,
 'b': {'b':('dfg','tfy') , 'x':[...] , 'z':('ynyu','zertzt')} ,
 'c': {'c':('noq','jek') , 'x':[...] , 'z':('frEZ','jkyukA')} ,
 'd': {'d':('bqi','bif') , 'x':[...] , 'z':('kiy',';jheTri')} }

它甚至可以更简化:

{'a': (('a', 'DSE','JHG') , [...] , ('QSZA','IUYOIU')) ,
 'b': (('b', 'dfg','tfy') , [...] , ('ynyu','zertzt')) ,
 'c': (('c', 'noq','jek') , [...] , ('frEZ','jkyukA')) ,
 'd': (('d', 'bqi','bif') , [...] , ('kiy',';jheTri')) }

本体值的第一个元素将始终是样式('a',类型,名称),第二个元素始终是样式'x'的列表,第三个元素总是一对(样式,名称)样式' Z'

元素('a',类型,名称),[...],(类型,名称)将通过位置0,1,2而不是键'a'+'y','x'访问,'z'

答案 2 :(得分:0)

为什么不使用XML? ElementTree附带Python并提供轻量级XML API。优点是您可以轻松创建分层数据结构,并且所有用于遍历/查询结构的工具都在那里。此示例创建一个简单的XML片段

from xml.etree import ElementTree

element = ElementTree.Element
xmlprint = ElementTree.tostring

o = element('ontology')

for key in ['a','b']:
    o.append(element(key,name=key))

for c in o.getchildren():
    c.append(element('type'))

print xmlprint(o)

由此给出,

<ontology><a name="a"><type /></a><b name="b"><type /></b></ontology>
相关问题