【问题标题】:creating named instances of a class within a for loop -- related to networkx -- Python在 for 循环中创建类的命名实例——与 networkx 相关——Python
【发布时间】:2014-03-15 12:10:48
【问题描述】:

我面临的问题如下:

假设我们有一些类(它的作用并不重要):

class Node: ...
    ...

我现在需要的是创建这个类的几个实例;都有名字。 我尝试了几件事,这里试一试,这显然是行不通的。只是为了明确我想要实现的目标:

for i in range(number_of_instances):
    "name"+str(i+1) = Node()

我需要所有这些对象的名称,以便稍后将它们放在列表中。实际上它是包含图表中所有节点的列表。该图将使用 networkx 模块制作。我需要能够以某种方式区分列表中的节点。这就是为什么我需要这个名字。

my_graph = networkx.Graph()
for i in range(number_of_nodes):
    my_graph.add_node(Node(), name = str(i+1))

执行此操作后,my_graph.nodes() list 不知何故混淆了节点的顺序。所以它与节点添加到图中的顺序不对应。 所以我不知道如何准确区分节点了。

编辑

鉴于图表的拉普拉斯算子,我设置了所有内容,然后绘制图表。

name_dict = nx.get_node_attributes(my_graph, "name")
pos = nx.spring_layout(my_graph)
nx.draw(my_graph, pos, with_labels=False)
nx.draw_networkx_labels(my_graph, pos, name_dict)
plt.show()

但是这不会导致正确的标签。

【问题讨论】:

  • 你好。虽然很多人不赞成使用globals() 做你想做的事(我不知道为什么),但我想你会在我的回复中找到问题的答案:(stackoverflow.com/a/5036827/551449)
  • Graph.nodenodes() 返回的内容)是一个字典......它是隐式无序的。您可以通过节点属性(即名称)获取节点。你到底想做什么?
  • 在此之后我想绘制图表。请参阅 edit 但标签不再正确..-.-
  • @eyquem:为什么通常会让你的代码更复杂更难理解,而使用全局变量会让你的代码更难管理。

标签: python networkx


【解决方案1】:

你不需要名字,你只需要一个参考。一种简单的解决方案是将引用放入字典中:

node = {}
for i in range(number_of_instances):
    node[i] = Node()
...
for i in range(number_of_nodes):
    my_graph.add_node(node[i], name="node %s" % i)

【讨论】:

  • 谢谢。我在标记引用而不是节点对象所在的地址时遇到了麻烦。我在那里的代码没有打印对正确 noe 的正确引用。我想我的代码几乎是正确的。无论如何它现在可以工作了^^
猜你喜欢
  • 2018-04-02
  • 2020-03-31
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2023-02-21
相关资源
最近更新 更多