Каков наилучший подход этой структуры данных в Python? - PullRequest
2 голосов
/ 22 февраля 2011

У меня в Python следующая ситуация: я анализирую онтологию и хочу отслеживать некоторые свойства онтологии и построить структуру данных со следующими характеристиками:

- будет однаключ для доступа к каждому значению

- это будет другая структура данных значения ключа со следующими тремя значениями:

'x': [] простой список

'y ': [{' name ': value,' type ': value}] список, содержащий конкретные ключевые ключи dictioanry

' z ': [{' name ': value,' type ': value}] список, содержащий определенные ключевые значения словаря

В соответствии с вышеизложенным окончательная структура данных, которую я, хотя и был:

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

И, наконец, я хочу несколько записей этого словарей. Я неЯ хочу использовать список, потому что индекс будет целым числом, и я хотел бы проиндексировать свои данные с помощью ключа.

Я заполню эту структуру данных внутри 3 различных циклов for.

Впервый цикл я заполню в словаре онтологии только ключом NAMes..Я подумал что-то вроде:

    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.

Это хороший подход для этой структуры данных? Я также подумал об использовании классов для того, чтобы мой код был более"структурированный", но я думаю, что я бы использовал гораздо больше строк кода

Ответы [ 3 ]

8 голосов
/ 22 февраля 2011

«Строки кода», вероятно, не лучший показатель для оптимизации.Это похоже на классический пример перерастания решения «словари и списки».Я был там много раз.Используйте класс, он позволит вам писать понятный обслуживаемый код с именованными методами для управления вашей структурой данных.

Это даст вам гибкость, позволяющую скрывать и изменять базовое хранилище без изменения семантики или представления вызывающей стороныданные.

1 голос
/ 22 февраля 2011

К " заполните словарь онтологий только именами ключей ":

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

или

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

Затем вы заполните {} каждого элемента онтологии с элементами 'a': [...] , 'b': [...] , 'c': [...]

.

Но я не вижу интереса в написании значения ontology ['a'] ['a'] как список, содержащий один уникальный элемент, который является словарем с одним уникальным элементом, имеющим всегда один и тот же ключ 'y'

Вместо записи этого значения 'a': [{'y': {'type': 'DSE', 'name': 'JHG'}}] , например, вы можете написать это 'a' :( 'DSE',' JHG ') .Зная, что первый элемент пары ('DSE', 'JHG') является типом, а второй - именем.

Вы также можете написать 'z' :('QSZA', 'IUYOIU') , зная, что first == тип, а second == имя.

Таким образом, онтология будет:

{'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'

0 голосов
/ 22 февраля 2011

Почему бы не использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...