我在一组按层次组织的数据集中有一组编号的组。每个组都有一个编号的标题,并且有该组的几个成员。例如:
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的子组,等等。任何帮助都是非常感谢的。我不知道要创建什么样的数据结构,所以我可以迭代它。谢谢。
发布于 2016-06-05 12:14:47
您会问“我应该在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并从JSON中恢复是很容易的。这应该可以满足您的需要,当然,也可以对结构或代码进行一些修改。
发布于 2016-06-05 12:40:17
如果您的主要目标是生成一个对JSON友好的结构,那么可以使用嵌套字典(如果元素的顺序很重要,则使用OrderedDict
)。它使事情变得简单,用json写出它将是微不足道的。每个字典都可以有一个键members
(直接分配给它的一个列表或一组子字典),还有一个键subgroups
,它是一个子词典的列表或字典。创建它并不难,因为父组的标题是子组的前缀。
https://stackoverflow.com/questions/37641649
复制相似问题