我在两组实体之间维护了一个邻接列表
dict1={'x1':[y1,y2],'x2':[y2,y3,y4]...}
dict2={'y1':[x1],'y2':[x1,x2],'y3':[x2]....}
鉴于有新条目,更新dicts的推荐方法是什么
假设条目是'x3':[y2,y4]。
请注意,x3可能不一定是新的顶点。
答案 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>