【问题标题】:is there a better way to hold this data then a dictionary of dictionaries of dictionaries? python有没有比字典字典更好的方法来保存这些数据? Python
【发布时间】:2010-08-06 19:43:52
【问题描述】:

我正在创建一个动态保存汽车信息的数据结构。字典看起来像这样:

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

最外层字典包含汽车品牌(丰田、宝马等),第二个字典包含模型(普锐斯、m5 等),内层字典包含汽车的详细信息。这是保存这些信息的最佳方式吗?

我正在构建数据结构并访问它。我真的想不出另一种方法来做到这一点,但代码看起来有点乱,有一堆:

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

【问题讨论】:

  • 我同意它看起来有点乱,但我只是写了一个算法,涉及递归的字典元组和列表({'dir': ({'dir': ({}, ['file', 'file']), 'dir': ({}, ['file'])}, ['file', 'file', 'file'])}, ['file', 'file'])
  • @Carson - 这是一个令人讨厌的结构......有什么理由不对其进行重构?
  • @Wayne 我本可以使用类而不是元组,但我希望将目录与文件分开,并且我选择了元组而不是实例化一大堆对象。而且其实算法还不错,不像结构那么复杂
  • @Carson,从技术上讲,创建元组实例化一堆对象——它们只是一种非常特殊的对象类型。至于分离,只有一些“dir”对象和一些“file”对象(当然,为了避免冲突/阴影而重命名)可能会产生与您的复杂数据结构相同的效果,但具有更多的可读性。不确定创建大量自定义对象与元组/字典的速度,但我猜它几乎相同。
  • @Wayne 没错——无论如何,我选择了这种编码来适应我的算法。数据结构是动态生成的,而算法不是。在任何情况下,我发现很容易对目录进行排序,递归到它们中,并且在完成处理给定目录的第一个元组元素后,对第二个元组元素进行排序和迭代。这种结构也类似于输出的结构,所以它让一切都很好地流动。

标签: python dictionary


【解决方案1】:

正如贾斯汀建议的那样,课程是理想的。

您可以轻松地执行以下操作:

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!

【讨论】:

  • 不错!我想对此投票,但在我达到投票上限的一天后,他们仍然要求我在 3 小时后回来。有一些小故障。
  • Python(和类似语言)的好处在于,Lance 要求数据结构是动态的仍然适用于类,因为您可以动态添加和删除属性。
【解决方案2】:

Python 有classes。我不知道这对您的数据结构是否有意义,但您可以将所有内容组织到 Car 类的集合中。

【讨论】:

    【解决方案3】:

    为什么不创建 JSON 结构?从语义上讲,您可能能够获得更多的表现力,而不是像字典元素一样访问您的数据。

    【讨论】:

    • 我相信 JSON 仍然不是 Lance 真正想要的。
    【解决方案4】:

    一个想法 - 扁平化由句点分隔的多段名称键控的嵌套字典。例如

    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', [])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多