питонский способ удаления атрибутов ребер - PullRequest
0 голосов
/ 13 мая 2018

Чтобы удалить атрибуты из графа networkx, у меня есть следующий код:

for (n1,n2) in graph.edges(data=False):  
    for att in att_list:  
        graph[n1][n2].pop(att, None)  

Есть ли более питонский способ сделать это?

1 Ответ

0 голосов
/ 13 мая 2018

Если вы хотите удалить только несколько атрибутов в каком-то списке, скажите att_list

for n1, n2, d in graph.edges(data=True):
    for att in att_list:
        d.pop(att, None)

Или вы можете заменить последнюю строку на if att in d: del d[att], если вас беспокоит, что pop возвращает что-то, что вы не используете. Улучшение по сравнению с вашим кодом заключается в том, что при data=True я получаю d сразу, а не при ссылке на graph[n1][n1] позже.

См. Безопасное удаление нескольких ключей из словаря , чтобы узнать, как удалить несколько ключей из словаря (что и есть d). По сути это то, что ваша проблема сводится к тому, как только вы получите d.

В качестве альтернативы, если вы хотите очистить все атрибуты, обратите внимание, что если мы установим data=True, то graph.edges также возвращает словарь с атрибутами. Очистить этот словарь.

for (n1, n2, d) in graph.edges(data=True):
    d.clear()

Вот полный пример

import networkx as nx
G=nx.Graph()
G.add_edge(1,2,weight=2)
G.edge[1][2]
> {'weight': 5}

for (n1, n2, d) in G.edges(data=True):
    d.clear()
G.edge[1][2]
> {}
#just to check the edge in the opposite order
G.edge[2][1]
> {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...