Написание нескольких циклов for (включая один, похожий на функцию sum ()) способом pythoni c - PullRequest
0 голосов
/ 01 августа 2020

Я пишу разные базовые c алгоритмы, чтобы попрактиковаться в написании кода в стиле pythoni c. Ниже приведена функция, которая производит базовый c рейтинг страницы на шаге k для данного графика G :

import networkx as nx

def basic_pagerank(G,k):
    
    G_nodes = [node for node in G.nodes()]
    lenG = len(G_nodes)
    old_score = [1/lenG]*lenG
    new_score = [0]*lenG
    
    for i in range(0,k):
        for node in G_nodes:
            s_lst = [s for s in G.successors(node)]
            len_s_lst = len(s_lst)
            if len_s_lst != 0:
                for s in s_lst:
                    s_i = G_nodes.index(s)
                    node_i = G_nodes.index(node)
                    new_score[s_i] = new_score[s_i] + old_score[node_i]/len_s_lst                
        old_score = new_score
        new_score = [0]*lenG
    
    return  dict(zip(G_nodes, old_score))

Так, например, для следующего graph:

G = nx.DiGraph()
G.add_edges_from([('A','B'),('B','C'),('B','D'),('C','B'),('D','A'),('D','C'),('D','E'),('E','A')])
basic_pagerank(G, 2)

вывод {'A': 0.1, 'B': 0.43, 'C': 0.23, 'D': 0.2, 'E': 0.03}.

У меня больше всего проблем с выражением самого внутреннего for-l oop способом pythoni c. Если я смогу это сделать, я думаю, что смогу написать остальное, используя понимание списка. Итак, по сути, мой вопрос: есть ли способ написать самый внутренний for-l oop способом pythoni c?

1 Ответ

1 голос
/ 01 августа 2020

Использование понимания списка:

def basic_pagerank(G,k):
    
    G_nodes = list(G.nodes())
    lenG = len(G_nodes)
    old_score = {n: 1/lenG for n in G_nodes}
    new_score = {n: 0 for n in G_nodes}
    
    for i in range(0,k):
        for node in G_nodes:
            s_list = list(G.successors(node))
            len_s_lst = len(s_list)
            s_score = {s: new_score[s] + old_score[node]/len_s_lst for s in s_list}
            new_score.update(s_score)
        old_score = new_score
        new_score = {n: 0 for n in G_nodes}
    
    return old_score
...