Пример граничного атрибута в NetworkX с использованием Python - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу взять три граничных атрибута из ориентированного графа, который я построил с помощью networkX. Ребра в графе с атрибутом «зависимость» перечислены ниже:

import networkx as nx
import random
from random import choice
G=nx.DiGraph()
G.add_edge('x','a', dependency=0.4)
G.add_edge('x','b', dependency=0.6)
G.add_edge('a','c', dependency=1)
G.add_edge('b','c', dependency=0.3)
G.add_edge('b','d', dependency=0.7)
G.add_edge('d','e', dependency=1)
G.add_edge('c','y', dependency=1)
G.add_edge('e','y', dependency=1)

Теперь я хочу выбрать три различных атрибута ребра сверху и умножить их на случайное число от 0 до 1. Это должно выглядеть как-то так:

for i in range(3):
    sampled_edge = random.sample(G.edges, 1)
    sampled_edge_with_random_number = sampled_edge['dependency'] * random.uniform(0,1)
    print(sampled_edge_with_random_number)

Но я продолжаю получать следующее сообщение об ошибке:

TypeError: list indices must be integers or slices, not str

Каков наилучший способ сделать это?

1 Ответ

1 голос
/ 10 февраля 2020

В вашем скрипте было две ошибки.

  1. Что такое random.sample(G.edges, 1)? Определенно это список, который содержит один элемент, поэтому он не может быть ключом для любого края. Правильный ключ sampled_edge[0]
  2. Что такое sampled_edge? Если это список или кортеж, у него не может быть никаких ключей. Единственное, что должно иметь ключ - это EdgeView вашего графика. Это должно быть G.edges тогда.

После того, как вы определили какое-либо ребро, вы также можете получить доступ к его атрибутам. Так что просто замените ваш sampled_edge['dependency'] на G.edges[sampled_edge[0]]['dependency'] в вашем скрипте и все.

...