以 pythonic 方式编写多个 for 循环(包括类似于 sum() 函数的循环)

Writing multiple for-loops (including one similar to the sum() function) in a pythonic way

我正在编写不同的基本算法来练习以 Python 方式编写代码。下面是一个函数,它在步骤 k 为给定的图 G:

生成基本的 pagerank 分数
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))

例如,对于下图:

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}

我在用 pythonic 方式表达最内层的 for 循环时遇到了最大的麻烦。如果我能做到这一点,我想我可以使用列表理解来编写其余部分。所以本质上,我的问题是,有没有一种方法可以用 pythonic 方式编写最内层的 for 循环?

使用列表理解:

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