Создайте граф авторов в виде списка ребер из парных словарных ключей в python - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь создать список смежности в python для соавторского графа.Я создал словарь автора

{'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]

Есть идеи?

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете использовать нарезку списка на 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 up гарантирует порядок вставки на полях
  • CPython 3.6 up имеет порядок вставки по деталям реализации / побочным эффектам
  • или используйте OrderedDict

для начала (или использовать keys = sorted(d.keys()))


Чтобы узнать порядок вставки текста, прочитайте информацию @ Упорядочены ли словари в Python 3.6 +?

...