将新条目插入邻接列表

时间:2013-06-27 04:44:00

标签: python

我在两组实体之间维护了一个邻接列表

dict1={'x1':[y1,y2],'x2':[y2,y3,y4]...}
dict2={'y1':[x1],'y2':[x1,x2],'y3':[x2]....}

鉴于有新条目,更新dicts的推荐方法是什么 假设条目是'x3':[y2,y4]。
请注意,x3可能不一定是新的顶点。

3 个答案:

答案 0 :(得分:2)

首先,我建议defaultdict,以便引用不存在的索引将其初始化为空列表。

from collections import defaultdict

dict1 = defaultdict(list)
dict1['x1'] = ['y1','y2']
dict1['x2'] = ['y2','y3','y4']
dict2 = defaultdict(list)
dict2['y1'] = ['x1']
dict2['y2'] = ['x1','x2']
dict2['y3'] = ['x2']

然后当'x3':[y2,y4]进来时:

dict1['x3'] = set(dict1['x3']+[y2,y4])
for y in dict1['x3']:
    dict2[y] = set(dict2[y]+'x3')

使用set消除重复值。显然,上述某些值比硬编码值更具动态性。

注意:这不是更快,实际上它可能更慢,但是defaultdict是避免KeyError的更好方法,你绝对不希望在你的adj列表中引入重复值,因为这会损害性能,或者甚至是正确性,适用于该图表的任何算法。

答案 1 :(得分:0)

为什么不能以简单的方式做到这一点?

dict1[x3] = [y2, y4]
for yi in dict1[x3]:
    if yi in dict2.keys():
        dict2[yi].append(x3)
    else:
        dict2[yi] = [x3]

答案 2 :(得分:0)

以下代码中的update()函数如何:

dict1={'x1':['y1','y2'],'x2':['y2','y3','y4']}

def mkdict2():
    dict2={}
    for x,ylist in dict1.items():
        for y in ylist:
            dict2[y] = list(dict2.get(y,[])) + [x]
    return dict2

dict2 = mkdict2()

print (dict1)
print (dict2)

def update(x,ylist):
    dict1[x] = list(dict1.get(x,[])) + ylist
    for y in ylist:
        dict2[y] = list(dict2.get(y,[])) + [x]

update('x3',['y2','y4'])

print (dict1)
print (dict2)

这给出了输出:

 {'x1': ['y1', 'y2'], 'x2': ['y2', 'y3', 'y4']}
 {'y3': ['x2'], 'y2': ['x1', 'x2'], 'y1': ['x1'], 'y4': ['x2']}
 {'x1': ['y1', 'y2'], 'x2': ['y2', 'y3', 'y4'], 'x3': ['y2', 'y4']}
 {'y3': ['x2'], 'y2': ['x1', 'x2', 'x3'], 'y1': ['x1'], 'y4': ['x2', 'x3']}

我总是担心拿着包含相同数据的两个数据结构,以防它们变得不一致,因此我最初使用mkdict2()dict2生成dict1。 / p>