如何在Python中存储int-list对?

时间:2015-04-08 09:58:03

标签: python list graph tuples

我有一个方向图结构,我想在Django中传递模板视图。所以我想用一对列表来表示图形:

[42] , [55,67,89]
[2] , [4]
[3] , []
[4] , [1,3,5]

此示例是节点42连接到节点53,57和89的图表。

我应该使用什么类型的数据结构来执行此任务?我真的很感激代码示例。

P.S。 :假设我已实现了get_children(node_id)函数,因此get_children(1)可以返回[2,3,5]的列表。

修改

抱歉,我忘了提到节点ID不一定像[1,2,3,4],它们是从数据库获得的,所以它们可以像[42,55,67]

编辑2:

我需要一个for循环来迭代地构建这个列表"或任何其他合适的数据结构。

编辑3:我正在寻找的,作为伪代码:

node_ids = get_from_database(graph_id)
relations = list_of_lists() # ?
for n in node_ids
    relations.add(key=n , value=get_children(n))
    #or, relations[n] = get_children(n)

感谢您的帮助!

5 个答案:

答案 0 :(得分:0)

我认为您可以使用简单的字典来执行此操作:

{1: [2,3,5],
 2: [4],
 3: [],
 4: [1,3,5]}

保存时,可以将其保存为json序列化形式。

您可能希望在Django中使用默认字段类型来使用JSONField

答案 1 :(得分:0)

如果您的顶点按递增顺序枚举,只需使用列表列表:

G = [[], [2, 3, 5], [4], [], [1, 3, 5]]  # indexing starting with 0

def get_children(g, node_id):
    return g[node_id]

get_children(G, 1)   # returns [2, 3, 5]

更新:如果顶点不按递增顺序排列,则可以选择列表字典:

def add_edge(g, x, y):
    if x not in g:
        g[x] = []
    g[x].append(y)

def add_edges(g, x, ys):
    for y in ys:
        add_edge(g, x, y)

# The code corresponding to your pseudocode.
node_ids = get_from_database(graph_id)
relations = {}
for n in node_ids:
    add_edges(relations, n, get_children(n))

答案 2 :(得分:0)

跟字典一起去。

e.g。

mapping = {1:[2,35], 2: [4], 3:[], 4: [1,3,5]}

将此词典传递给模板。

e.g。

render_to_response('graph_show.html', {'status':True, 'data_dict':mapping}

答案 3 :(得分:0)

您可以使用列表结构本身。您可能需要处理索引(python索引从0开始)。

答案 4 :(得分:0)

如果它总是被排序而没有被跳过,你可以轻松使用列表列表:

nodes = [
 [],         # zero indexing
 [2, 3, 5], 
 [4], 
 [], 
 [1, 3, 4], 
]

要获取i元素只是访问列表。

nodes[1]
  

[2,3,5]

但我更喜欢以前的dict版本。