2010-08-06 3 views
2

Я динамически создаю структуру данных, которая содержит информацию о машине. Словарь выглядит примерно так:есть ли лучший способ сохранить эти данные, а затем словарь словарей словарей? python

cars = {'toyota': {'prius': {'transmission':'automatic', 'mpg':30, 'misc':[]}}} 

внешний словарь содержит марка автомобиля (Тойота, бмв, и т.д.), второй словарь содержит модель (Приус, m5 и т.д.), а внутренний словарь содержит подробные сведения о автомобиль. Это лучший способ сохранить эту информацию?

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

cars['toyota'].setdefault('prius', {}).setdefault('misc', []).append('hello') 
+0

Я согласен, что это выглядит вид грязные, но я просто написал алгоритм с участием рекурсивных кортежей dicts цепочка dicts и списков '({«реж»: ({«реж»: ({}, [ 'file', 'file']), 'dir': ({}, ['file'])}, ['file', 'file', 'file'])}, ['file', 'file' ]) ' –

+0

@ Карсон - это неприятная структура ... по какой-либо причине это не рефакторизуется? –

+0

@Wayne Я мог бы использовать классы вместо кортежей, но я хотел, чтобы разделы были отделены от файлов, и вместо этого я выбрал кортежи вместо того, чтобы создавать целые кучи объектов. И на самом деле алгоритм довольно приятный, не такой сложный, как структура –

ответ

0

Почему бы не создать структуру JSON? Семантически вы могли бы получить немного больше выразительности, а не получать доступ к своим данным в качестве элементов словаря.

+0

Я считаю, что JSON все равно не будет тем, чего хочет Лэнс. – 2010-08-06 20:14:40

5

Python имеет classes. Я не знаю, имеет ли смысл вашу структуру данных, но вы можете организовать все в коллекцию классов Car.

11

Как предложил Джастин, классы были бы идеальными.

Вы можете легко сделать что-то вроде этого:

class Car(object): 
    def __init__(self, make, model=None, trans=None, mpg=None, misc=None): 
     if make == 'Toyta' and model is None: 
      model = 'Prius' 
     self.make = make 
     self.model = model 
     self.transmission = trans 
     self.mpg = mpg 
     if misc is None: 
      self.misc = [] 
    #other class stuff here 
    def __str__(self): 
     return "Make: {make} Model: {model} Mpg: {mpg}".format(make=self.make, 
                   model=self.model, 
                   mpg=self.mpg) 
    def __repr__(self): 
     return str(self) 

cars = [Car('Toyota', 'Prius', 'Automatic', '30'), 
     Car('Mitsubishi', 'Echo LRX', 'Automatic', '20')] 

for car in cars: 
    print car 

HTH!

+0

Ницца! Я хотел проголосовать за это, но на следующий день после того, как я достиг предела, чтобы продолжить, они все еще просят меня вернуться через 3 часа. Есть какой-то сбой. – 2010-08-06 20:15:55

+2

И приятная вещь о Python (и подобных языках) заключается в том, что запрос Ланса о динамической структуре данных работает с классами, поскольку вы можете динамически добавлять и удалять атрибуты. – JAB

0

Одна идея - сгладить вложенный словарь с помощью многосегментного имени, разделенного точкой. Например.

cars.setvalue('toyota.prius.transmission', 'automatic') 
cars.setvalue('toyota.prius.mpg', '30') 
cars.setvalue('toyota.prius.misc', []) 

cars.getvalue('toyota.prius.misc').append('hello') 

class Car: 
    def setvalue(self, key, value): 
     # parse the key and do your mess here, like 
     # cars['toyota'].setdefault('prius', {}).setdefault('misc', []) 
Смежные вопросы