我正在用Python编写一个八叉树类型的东西,目前它能够存储的只是一个ID。但是,我想改变它以便它可以存储任何数量的东西,而且我不确定哪种方式会更好,考虑到这可能是成千上万的值。
将它作为普通列表存储是否合适,以及在向代码中添加内容时索引中的硬代码,还是将其存储为字典以便更容易获得所需的值?
=[ID, stuff1, stuff2...]
={'ID': num, 'stuff1': something, 'stuff2': something}
如果您希望使用第一种方式使用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
}
答案 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)
将dicts
和lists
混合在一起没有任何问题。
这可以为您提供比仅使用一种结构更优雅的解决方案。
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)