我在数据集中有一组编号的组,这些组是按层次组织的。每个组都有一个编号的标题,并有该组的几个成员。例如:
01 : Tony, John, Meredith
01.01 : Alex, Fred, Melissa
02 : Alley, Henry, Natalie
02.01.02 : Chris, Pete
03 : Andrew
03.01 : Nancy, Peter, Harold
我应该在python中使用什么数据结构来组织这些组?我需要维护层次结构,以便01.01是0.1的子级。数据结构深达7级,如:01.03.01.01.02.04.05,该组是01.03.01.01.02.04组的子级,依此类推。任何帮助深表感谢。我不确定要创建什么数据结构,所以我可以迭代它。感谢。
答案 0 :(得分:1)
你问“我应该在python中使用什么数据结构来组织这些组?”
自上而下编程的一个关键原则是,在决定将对结构进行的操作以及它们的相对频率和任何其他标准(例如)之前,您不会决定抽象数据结构的实现。简单和内存使用)。您尚未说明这些信息,因此我们无法推荐具体的实施方案。
我可以想出许多方法来做你所要求的:树,列表中的列表,字典中的字典等。每种方法都有其优点和缺点。关于一点,我确实很奇怪。在你的结构中,新子级别的每个项目都以'01'开头,但'02 .01.02:Chris,Pete'除外,它以'02'开头。这是故意的吗?如果你保持其他明显的编号,那就会打开一些更简单的实现。
通过评论中添加的信息,我建议使用嵌套列表。每个数据项都有一系列以零结尾的索引,结构中的任何其他内容都是包含其他数据项和列表的列表。在您的示例中,如果我们将整个结构命名为a
,则项01为a[1][0]
,项01.01位于a[1][1][0]
,项02.01.02位于a[2][1][2][0]
,等等。此结构允许稍后插入更多项目,因此我们可以轻松添加项目01.01.01而不会打扰其他项目。不需要在结构中存储项目编号:它们是从结构中数据项的位置直接推断出来的。
此实现还允许整个结构具有数据项,该数据项具有空项目编号并存储在a[0]
中。可以通过None
标记缺失的数据项,空白项可以是另一个空项,例如''
。下面是代码,显示了打印出来的示例结构和代码。
def print_structure(structure, level=''):
"""Iterate through a heirarchical data structure, printing the data
items with their level numbers"""
for i, item in enumerate(structure):
if i == 0:
# Process each data item appropriately
if item is not None:
print(level + ' : ' + str(item))
else:
new_level = format(i, '02')
if level:
new_level = level + '.' + new_level
print_structure(item, new_level)
a = [None,
['Tony, John, Meredith',
['Alex, Fred, Melissa']],
['Alley, Henry, Natalie',
[None,
['?'],
['Chris, Pete']]],
['Andrew',
['Nancy, Peter, Harold']]]
print_structure(a)
在此实现中,每个“组”都是一个字符串。我把组'?'
放在你说组存在的地方,但没有说明它是什么,我把None
放在你没有说数据项存在的地方。要修改结构的处理,只需在注释Process each data item appropriately
之后更改两行。上述代码的打印输出是
01 : Tony, John, Meredith
01.01 : Alex, Fred, Melissa
02 : Alley, Henry, Natalie
02.01.01 : ?
02.01.02 : Chris, Pete
03 : Andrew
03.01 : Nancy, Peter, Harold
从JSON保存和恢复很容易。这应该满足您的需求,当然,可以对结构或代码进行一些修改。
答案 1 :(得分:0)
如果你的主要目标是生成一个JSON友好的结构,你可以写出来,使用嵌套的词典(如果元素的顺序很重要,则使用OrderedDict
)。它保持简单,用json写出来将是微不足道的。每个字典可以有一个键members
(一个列表或一组直接分配给它的子项),以及一个键subgroups
,它是子词典的列表或词典。它不难创建,因为父组的标题是子组的前缀。