将多个项目的字典值存储为列表或词典是否更好?

时间:2015-04-10 15:32:43

标签: python list dictionary

我正在用Python编写一个八叉树类型的东西,目前它能够存储的只是一个ID。但是,我想改变它以便它可以存储任何数量的东西,而且我不确定哪种方式会更好,考虑到这可能是成千上万的值。

将它作为普通列表存储是否合适,以及在向代码中添加内容时索引中的硬代码,还是将其存储为字典以便更容易获得所需的值?

  1. =[ID, stuff1, stuff2...]
  2. ={'ID': num, 'stuff1': something, 'stuff2': something}
  3. 如果您希望使用第一种方式使用ID,则使用voxel_info[0],但随着添加更多值,可能会更加复杂,例如owner = voxel_info[4]; importantText = voxel_info[5](您必须记住哪个索引与哪个相关)对于代码中的所有点,或者使用字典方式,如果添加更多内容,获取值会更容易。

    字典方式似乎更有用,但它似乎也会减慢代码速度并使用更多内存,因为它存储了成千上万字典的文本键。你可能会推荐哪种方式?

    为了了解数据的存储方式,就像这样。如果所有块信息都相同,则会对项目进行分组,因此您可以获得不同的深度。 BLOCKINFO部分是信息存储的地方,这就是我要求的列表或字典。

    OctreeData={ Depth: 2
                 Nodes: (1,1,1): {Depth:1
                                Nodes: (1,1,1): BLOCKINFO
                                       (1,1,-1): {Depth: 0
                                                Nodes: (1,1,1): BLOCKINFO
                                                       (1,1,-1): BLOCKINFO
                                                       (1,-1,-1): BLOCKINFO
                                                       etc
                                       (1,-1,-1): BLOCKINFO
                                       (-1,-1,-1): BLOCKINFO
                                       (-1,-1,1): {Depth: 0
                                                   Nodes: etc
                                       etc
                        (1,1,-1): BLOCKINFO
                        etc
               }
    

2 个答案:

答案 0 :(得分:2)

这实际上取决于您的项目列表有多大以及您希望如何访问它们

[[ID,stuff1,stuff2,stuff3],[ID,stuff1,stuff2,stuff3],...]

O(N)搜索

同样

[{'ID':'id','stuff':[1,2,3]},{'ID':'id','stuff':[1,2,3]}]

O(n)搜索

{'ID1':['stuff1','stuff2','stuff3'],
 'ID2':['stuff1','stuff2','stuff3'],
 'ID3':['stuff1','stuff2','stuff3']}

但只会O(1)进行搜索(假设您搜索ID)

但实际上我建议使用数据库(如果你聪明的话,+一个orm)

答案 1 :(得分:1)

dictslists混合在一起没有任何问题。

这可以为您提供比仅使用一种结构更优雅的解决方案。

my_data = [
    { 'ID' : 1, 'stuff' : ['stuff1', 'stuff2', 'stuff3']},
    { 'ID' : 2, 'stuff' : ['stuff1', 'stuff2', 'stuff3']},
    { 'ID' : 3, 'stuff' : ['stuff1', 'stuff2', 'stuff3']},
]

...或

my_data = {
    'ID1' : [ 'stuff1', 'stuff2', 'stuff3'],
    'ID2' : [ 'stuff1', 'stuff2', 'stuff3'],
    'ID3' : [ 'stuff1', 'stuff2', 'stuff3'],
}

就个人而言,我会选择选项1.为什么?列表中的每个字典都具有相同的结构。这使它更清晰,更容易理解。

至于搜索,您可以使用过滤器:

from functools import partial

def custom_filter(data, filter_value=None):
    if data['ID'] == filter_value:
        return True
    return False

filter_on = 1
print filter(partial(custom_filter, filter_value=filter_on), my_data)