从 python 中的成对字典键创建作者图作为边列表

Create a graph of authors as edge list from paired dictionary keys in python

我正在尝试在 python 中为合着图创建一个邻接表。 我创建了一个字典 pf author

{'a1': ' A-ming Hao',
 'a2': ' Qing-zhen Wang',
 'a3': ' Xiao-long Li',
 'a4': ' Ming-da Zhai'}

我用这种方法创建了边缘。

g=nx.Graph()    

g.add_edge(y[0]['a1'],y[0]['a2'])
g.add_edge(y[0]['a2'],y[0]['a3'])
g.add_edge(y[0]['a3'],y[0]['a4'])
g.add_edge(y[0]['a4'],y[0]['a1'])

但我想使用 for 循环

for key,val in (y[0].items()):
    g.add_edge(y[0][key],y[0][key])

我希望这个循环遍历每个键。 并像这样创建边缘

g.add_edge(y[0][key],y[0][key+1])

以便在 key[a1]key[a2], 之间创建边。 在我的for循环中,它实际上是key[a1]key[a1]之间的一条边。

当它到达最后一个时 key[a4] 先连接它 key[a1]

有什么想法吗?

您可以将 dict.keys() 上的列表切片与 zip() 结合使用,将您的元组放入图表中:

authors = {'a1': ' A-ming Hao',
           'a2': ' Qing-zhen Wang',
           'a3': ' Xiao-long Li',
           'a4': ' Ming-da Zhai'}

keys = list(authors .keys())

# zip keys with itself - rotated by 1 element
tups = list(zip(keys, keys[1:]+keys[0:1]))

print(tups)

输出:

[('a1', 'a2'), ('a2', 'a3'), ('a3', 'a4'), ('a4', 'a1')]

使用这些元组你可以做:

g = nx.Graph()
for a,b in tups:
    g.add_edge(authors[a], authors[b])

您应该记住,键的显示顺序可能会有所不同 - 如果您需要确保插入顺序,您需要使用:

  • python 3.7 向上保证字典的插入顺序
  • CPython 3.6 上有实现的插入顺序 detail/sideeffect
  • 或使用 OrderedDict

开头(或使用 keys = sorted(d.keys())


dict插入顺序,阅读资料@