2016-03-22 2 views
0

Я очень новичок в сети и графике вообще и хотел вашей помощи.Добавить узел в сеть x только в том случае, если узел с таким же атрибутом не существует

Я проектирую график, в котором каждый узел имеет node_id (это всего лишь количество точек, которые я выполняю, чтобы сделать мой график) и пять атрибутов.

I.e.

G.add_node(node_id) 
G[id]['Coord1'] = 3 
G[id]['Coord2'] = 7 
G[id]['Coord3'] = None 
G[id]['Coord4'] = None 
G[id]['Coord5'] = None 

Так что теперь я хочу рассмотреть вопрос о добавлении нового узла с некоторыми координатами.

Теперь перед добавлением нового узла в мой график, я хочу проверить, что еще нет узла, который имеет атрибут (один из коордов), который совпадает с узлом, который я собираюсь добавить.

Если уже существует узел, который имеет общую общую координату, то я не буду добавлять новый узел, а просто внести некоторые изменения в существующий узел.

Единственный способ, которым я мог придумать это, - это перебрать все существующие узлы в графе и проверить, совпадает ли один из атрибутов с узлом, который я рассматриваю при добавлении. Например.

find_node = [attrdict for n,attrdict in G.node.items() if attrdict['coord1'] == tempcoord ]  

Где tempcoord - координата интереса на узле, который я собираюсь добавить.

Это явно очень неэффективно, чтобы делать это каждый раз, когда я хочу добавить узел, чтобы проверить все существующие узлы, мой вопрос: есть ли лучший способ?

Я понимаю, что networkx не добавит новый узел с одним и тем же идентификатором, но это не распространяется на узлы, которые имеют одинаковый атрибут правильно?

В качестве альтернативы, лучше ли построить граф со всеми этими «дублирующими» узлами, а затем сконденсировать все узлы, которые имеют некоторые общие атрибуты вниз в один узел после того, как я добавил все узлы?

Извините за несколько запутанное объяснение, я надеюсь, что это имеет смысл.

+0

У этих ответов не было уместным? http://stackoverflow.com/questions/23233127/how-to-get-values-from-specific-node-attributes-in-networkx-with-python?rq=1 или http://stackoverflow.com/questions/ 15644684/best-practices-for-querying-graphs-by-edge-and-node-attributes-in-networkx? Rq = 1 – zezollo

+0

Привет, Zezollo, спасибо, что указал на эти потоки. Хотя они определенно связаны, они действительно не отвечали на мой вопрос. Я знаю, как получить список значений атрибутов и индексов и просто выбрать все узлы с определенными атрибутами. Мне было интересно, можно ли получить доступ к узлу на основе уникального атрибута, а не индекса узла. – AHawks

+0

В сущности, я хочу иметь доступ к узлу с помощью нескольких атрибутов хеширования, а не только индекса узла. Есть ли способ сделать это? – AHawks

ответ

1

Создайте набор, содержащий все наблюдаемые атрибуты узла. Если вы хотите добавить узел с заданным атрибутом, проверьте, есть ли этот атрибут. Если это так, не делайте ничего, но если нет, добавьте его и поместите атрибут в набор. Возможно, стоит определить функцию для выполнения этих действий, если она выполняется в разных частях кода.

seen_attributes = set() 

# code here adding nodes 

node = node_to_add 
attribute = attribute_of_node 

if attribute not in seen_attributes: 
    G.add_node(node, coord=attribute) 
    seen.add(attribute) 
+0

Это хорошая идея и, безусловно, будет работать, мне удалось решить мою проблему, также включая словарь, в котором ключ был атрибутом и значением индекса узла. Таким образом, я могу проверить словарь для ключа, и если он был найден, я знаю, что узел уже существует. – AHawks

Смежные вопросы