1

我是python编码的新手。我希望修改此代码以开发二分两种模式版本。它是来自 networkx 的代码,用于制作几何随机图。我必须掌握这个功能的大部分内容,但我无法准确理解第 94 到 99 行在做什么。我理解 while, zip 和 nodes.pop() 但其他部分让新手感到困惑。任何人都可以帮助解释这部分代码所做的比给出的一般 # 描述更多吗?

G=nx.Graph()
G.name="Random Geometric Graph"
G.add_nodes_from(range(n)) 
if pos is None:
    # random positions
    for n in G:
        G.node[n]['pos']=[random.random() for i in range(0,dim)]
else:
    nx.set_node_attributes(G,'pos',pos) 
# connect nodes within "radius" of each other
# n^2 algorithm, could use a k-d tree implementation
nodes = G.nodes(data=True)
while nodes:             #line94
    u,du = nodes.pop()
    pu = du['pos']
    for v,dv in nodes:
        pv = dv['pos']
        d = sum(((a-b)**2 for a,b in zip(pu,pv))) #line99
        if d <= radius**2:
            G.add_edge(u,v)
return G
4

1 回答 1

2
nodes = [some list]
while nodes:
  a = nodes.pop()
  for b in nodes:
    # do something

这段代码是一个非常常见的习惯用法,将每个节点与每个其他节点仅组合一次(因此,对于该部分中执行的操作,顺序ab应该无关紧要# do something)。

它之所以有效,是因为空列表在循环条件下被认为是假值while,而非空列表被认为是布尔真。

d = sum(((a-b)**2 for a,b in zip(pu,pv)))

这条线计算两个向量和的欧几里得距离的平方。最好将其拆开来证明这一点:pupv

>>> pu = (6,6,6)
>>> pv = (1,3,7)
>>> zip(pu, pv)
[(6, 1), (6, 3), (6, 7)]
>>> [(a-b) for a,b in zip(pu, pv)]
[5, 3, -1]
>>> [(a-b)**2 for a,b in zip(pu, pv)]
[25, 9, 1]
>>> sum((a-b)**2 for a,b in zip(pu, pv))
35

在最后一步中,我们不再使用列表推导,因为我们不需要列表。sum只需要某种可迭代形式的值,所以我们使用生成器表达式。

于 2012-04-06T10:36:01.857 回答