【问题标题】:Replacing the values of `edgelist` with those of a `labels` dictionary将 `edgelist` 的值替换为 `labels` 字典的值
【发布时间】:2016-01-25 10:34:49
【问题描述】:

我是 Python 和 NetworkX 的新手。我有一个正方形的规则图GNxN 节点(一个)。这些节点通过dict 标记(参见下面的代码)。现在我希望 edgelist 返回每​​个边的 startendpoint ,而不是通过引用节点坐标而是通过节点给定的标签。

例子:

N = 3
G=nx.grid_2d_graph(N,N)
labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() )
#This gives nodes an attribute ID that is identical to their labels
for (i,j) in labels:
    G.node[(i,j)] ['ID']= labels[(i,j)]
edgelist=G.edges() #This gives the list of all edges in the format (Start XY, End XY)

如果我使用N=3 运行它,我会得到:

In [14]: labels
Out[14]: {(0, 0): 6, (0, 1): 3, (0, 2): 0, (1, 0): 7, (1, 1): 4, (1, 2): 1, (2, 0): 8, (2, 1): 5, (2, 2): 2}

此方案将左上角的节点标记为0,将节点(N-1)th 放置在右下角。这就是我想要的。现在edgelist的问题:

In [15]: edgelist
Out [15]: [((0, 1), (0, 0)), ((0, 1), (1, 1)), ((0, 1), (0, 2)), ((1, 2), (1, 1)), ((1, 2), (0, 2)), ((1, 2), (2, 2)), ((0, 0), (1, 0)), ((2, 1), (2, 0)), ((2, 1), (1, 1)), ((2, 1), (2, 2)), ((1, 1), (1, 0)), ((2, 0), (1, 0))]

我试图用这些行来解决问题(灵感来自这里:Replace items in a list using a dictionary):

allKeys = {}
for subdict in (labels):
    allKeys.update(subdict)

new_edgelist = [allKeys[edge] for edge in edgelist]

但我得到了这件美妙的事情,它启发了我的星期一:

TypeError: cannot convert dictionary update sequence element #0 to a sequence

总结,我希望能够将edgelist 列表的元素替换为labels 字典的值,这样,例如,来自((2,0),(1,0)) 的边缘(对应于节点 87) 返回(8,7)感激不尽!

【问题讨论】:

    标签: list loops dictionary list-comprehension networkx


    【解决方案1】:

    我相信您正在寻找的只是nx.relabel_nodes(G,labels,False) 这里是documentation

    这是我在调用 relabel nodes 函数之前和之后打印 G 的节点时的输出。

    # Before relabel_nodes
    [(0, 1), (1, 0), (0, 0), (1, 1)]
    # After relabel_nodes
    [0, 1, 2, 3]
    

    完成此操作后,边缘标签会自动变为您所期望的。

    # Edges before relabelling nodes
    [((0, 1), (0, 0)), ((0, 1), (1, 1)), ((1, 0), (0, 0)), ((1, 0), (1, 1))]
    # Edges after relabelling nodes
    [(0, 1), (0, 2), (1, 3), (2, 3)]
    

    另外,我已在您创建的聊天中回复了此问题,但您似乎没有收到通知。

    【讨论】:

    • 非常感谢。我确实在聊天中遇到了一些问题,所以是的,我没有收到通知。我很抱歉以前没有读过这个。 :)
    • 我不太确定我是否理解您的问题。但是是的,标签定义对于完美的结果至关重要
    • 是的,因为您发送到 networkx 绘制函数的 pos 字典使用格式为 (i,j) 的键映射节点,并且您更改了标签,因此函数无法找到标记的节点的位置0. 因此,您必须调整 pos 字典以映射从 n:(i,j)
    • 实际上您创建的聊天链接将我发送到聊天室,它不适合您吗? chat.stackoverflow.com/rooms/92866/…
    • 我不确定你是否收到了聊天通知,但你必须检查链接,我在那里回答。 @FrancescoCastellani
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2021-08-31
    • 2011-08-05
    • 2021-10-16
    • 1970-01-01
    • 2013-11-15
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多