以 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
我正在编写不同的基本算法来练习以 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