Python - повторить данную функцию n раз - PullRequest
0 голосов
/ 24 июня 2018

Следующий код находит сообщества для данного графа 'G' и присваивает узлам в этом графе значения от 0 до n, основываясь на сообществе, в которое они попадают.Затем код создает новые подграфы для каждого сообщества и находит узел с самой высокой степенью в каждом.Наконец, верхний узел из каждого подграфа интегрируется в общий словарь:

   G = 'max : john', 'max : tom', 'jim : john'....'jack : james'
   node_partition = dict(community_louvain.best_partition(G))   

   print node_partition = max: 1, john: 0, james: 3, jim: 4,...tom: 0

   """number of communities = n = list(set(node_partition.values()))"""

   dict0 = {k: v for k, v in node_partition.items() if v !=[0]} 
       G0 = G.copy()   
       G0.remove_nodes_from(dict0)
       degree0 = dict(G.degree(G0))
       degree0_dict = dict(sorted(degree0.items(), key=operator.itemgetter(1), reverse=True)[:1])

   star_dict = {**degree0_dict, **degree1_dict....**degreek_dict)

Этот подход работает, однако граф может иметь n количеств сообществ, и, как вы можете видеть, приведенный выше код толькодля узлов в сообществе 0. Я должен вручную прочитать количество определенных сообществ, а также вручную повторить и отредактировать код для каждого числа.Как я могу применить функцию, которая автоматически повторяет этот код, чтобы вместо «0» я мог иметь «n»?

1 Ответ

0 голосов
/ 24 июня 2018

Предположим, ваш раздел хранится в node_partition, затем мы создадим новый словарь, состоящий из инвертированного ключа, пар значений node_partition, что поможет нам позже уменьшить вычислительную сложность.(См. для инвертирования диктитуры и для получения ключа с максимальным значением в словаре .)

def invert(d):
    """Turn {a:x, b:x} into {x:[a,b]}"""
    r = {}
    for k, v in d.items():
        r.setdefault(v, []).append(k)
    return r

invert_partition = invert(node_partition)
# { 0 :[tom, john] , 1: [mike, elton] ... }

max_deg_per_comm = {}
#iterate over each community
for community_id in invert_partition.keys():
    #Extract the sub graph containing the community nodes
    temp_graph = G.subgraph(invert_partition[community_id])

    #Extract the degrees in the subgraph
    temp_degree = dict(temp_graph.degree())

    #Store it in a dictionary, with key as community_id and value as the node with max degree
    max_deg_per_comm[community_id] = max(temp_degree, key=lambda x: temp_degree[x])

Теперь вы можете использовать словарь max_deg_per_comm для полученияузел, предположим, что вы хотите найти узел для сообщества 0, вы используете

max_deg_per_comm[0]
...