对象与字典:如何组织数据树?

| 我正在对某种模拟进行编程,其数据以树的形式组织。主要对象是
World
,其中包含一堆方法和
City
对象的列表。每个“ 1”对象又具有一堆方法和一个“ 3”对象列表。 “ 3”个对象没有自己的方法,仅包含属性。 我的问题是关于后一个“ 3”对象,我可以从“ 6”派生对象,也可以将其创建为字典。组织这些最有效的方法是什么? 以下是一些说明我犹豫的案例: 保存数据 我需要能够保存和加载仿真,为此目的,我使用了内置的json(我希望数据是人类可读的)。由于该程序以树形组织,因此在每个级别上保存数据都非常麻烦。在这种情况下,总体最好保留为字典,并附加到
population
列表作为
City
实例的属性。这样,保存只是将
City
实例的
__dict__
传递给Json的问题。 使用数据 如果要操纵总体数据,则作为类实例比作为字典更容易。不仅语法简单,而且在编码时我还可以更好地使用自省功能。 性能 最后,我不确定什么是最有效的资源。一个对象和一个字典的末尾几乎没有什么区别,因为每个对象都有一个ѭ10can属性,可用于访问其所有属性。如果我使用大量的
City
Population
对象运行模拟,那么使用较少资源的对象或字典将是什么? 再次重申,在树中组织数据的最有效方法是什么?字典或对象更可取吗?还是组织数据树有什么秘密?     
已邀请:
        为什么不混合使用
dict
/
object
class Population(dict):
    def __getattr__(self, key):
        return self[key]
    def __setattr__(self, key, value):
        self[key] = value
现在,您可以通过属性(
foo.bar
)轻松访问已知名称,同时仍具有
dict
功能来轻松访问未知名称,对其进行迭代等,而无需笨拙的
getattr
/
setattr
语法。 如果要始终使用特定字段初始化它们,则可以添加
__init__
方法:
def __init__(self, starting=0, birthrate=100, imrate=10, emrate=10, deathrate=100):
     self.update(n=starting, b=birthrate, i=imrate, e=emrate, d=deathrate)
    
        如您所见,实际的差异很小-我认为主要的差异是使用单独的硬编码属性对于对象(无需引用名称)稍微容易一些,而dict则可以轻松地处理所有值作为一个集合(例如,求和)。这就是为什么我会选择对象的原因,因为总体对象的数据可能是异构的并且相对独立。     
        我认为您应该考虑使用
namedtuple
(请参阅
collections
模块上的Python文档)。您可以像使用普通类一样按名称访问
Population
对象的属性。用
population.attribute_name
代替
population[\'attribute_name\']
。由于您没有在
Population
类上放置任何方法,这就是您所需要的。 对于您的“保存数据”标准,还有一个
_asdict
方法,该方法将字段名的字典返回为可以传递给json的值。 (根据所使用的Python版本,您可能需要小心从此方法中获得的确切信息。某些版本返回字典,而某些版本返回
OrderedDict
。这可能对您的目的没有任何影响。 )
namedtuples
也很轻巧,因此它们也可以满足您的“运行模拟”资源需求。但是,我想回应其他人的警告是不要担心,除非您要进行一些认真的数据处理,否则差异将很小。     
        我想说,在每种情况下,人口都是城市的成员,如果仅是数据,为什么不使用字典呢? 不必担心性能,但是如果您真的需要知道,我认为命令更快。     

要回复问题请先登录注册