Python 在邻接列表中插入新条目

Python 在邻接列表中插入新条目,python,Python,我在两组实体之间维护了一个邻接列表 dict1={'x1':[y1,y2],'x2':[y2,y3,y4]...} dict2={'y1':[x1],'y2':[x1,x2],'y3':[x2]....} 如果有新条目出现,建议用什么方法更新dicts。 假设条目为“x3”:[y2,y4]。 请注意,x3不一定总是一个新的顶点。为什么不能用一种简单的方法来实现呢 dict1[x3] = [y2, y4] for yi in dict1[x3]: if yi in dict2.keys(

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

dict1={'x1':[y1,y2],'x2':[y2,y3,y4]...}
dict2={'y1':[x1],'y2':[x1,x2],'y3':[x2]....}
如果有新条目出现,建议用什么方法更新dicts。
假设条目为“x3”:[y2,y4]。

请注意,x3不一定总是一个新的顶点。

为什么不能用一种简单的方法来实现呢

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

首先,我建议
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列表中引入重复值,因为这将损害应用于此图的任何算法的性能,甚至可能是正确性。

更新()在以下代码中起作用:

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()
首先从
dict1
生成
dict2

请明确您要更新的dict以及更新的结果。@user1943282我想他希望更新这两个dict,就像它们是节点之间的双向边一样。它是一个邻接列表-因此,这两个dict都将针对任何新条目进行更新在中。显然,它可能是dicts的新添加项或任何现有条目的更新。需要一些东西来处理
yi
的索引器,而不是
dict2
我可以。对于新条目a,我需要为密钥迭代dict1(和dict2);此后,我需要对A中的每一个值在剩余的dict中做同样的操作。只需要检查是否有一种优雅而快速的方法来实现这一点,这也可能会引入重复values@Brian:如果新的图形顶点是
x3
,那么如何设置呢?@IUnknown:您不需要迭代dict,您在其中查找一个值;这在python中非常快