用信息迭代填充 Networkx Graph

Populating Networkx Graph with info iteratively

我一直在尝试开发一个图形结构,该结构将 link 实体根据它们之间共同提到的特征,例如如果在一篇文章中共同提到 2 个地方,则 linked。

我已经设法做到了,但我一直无法用新信息迭代填充边,同时保留现有信息。

我的方法(因为我在任何地方都找不到任何相关信息)是将现有信息附加到列表中,在列表中附加新的 link 并将该列表分配给适当的功能。

    temp = []
    if G.has_edge(i[z],i[j]):
        temp.append(G[i[z]][i[j]]['article'])
        temp.append(url[index])
        G[i[z]][i[j]]['article'] = temp
    else:
        print "Create edge!"
        G.add_edge(i[z],i[j], article=url)
    del temp[:]

正如你在上面看到的,因为有很多 link 需要填充,我定义了一个专用列表 (temp),加载了一个名为 article 的 link 变量的旧内容(如果 link 不存在,我创建一个 link 并将 "brought" 2 放在一起的 url 作为第一个值添加。

我的问题是,当我每次尝试查看 link 的 url 时,为了在新对出现时清空列表,我得到了类似这个:

{'article': [[...], u'http://www.huffingtonpost.co.uk/.../']

似乎我只保留了最后一个 link,因为每次我删除临时列表的内容时,但我找不到更好的方法来执行此操作而不声明一堆不必要的临时列表。

有什么想法吗?

感谢您的宝贵时间。

我认为您以前的所有 URL 都在您的新列表中。他们在 [...].

从边缘获取现有列表时,必须使用扩展而不是追加。

temp = []
temp.append([1, 2, 3])
temp.append(1)
print(temp)

您将获得:

[[1, 2, 3], 4]

但如果你这样做:

temp = []
temp.extend([1, 2, 3])
temp.append(4)
print(temp)

你得到:

[1, 2, 3, 4]

TL/DR 摘要:将整个代码段更改为

if G.has_edge(i[z],i[j]):
        G[i[z]][i[j]]['article'].append(url[index])
    else:
        G.add_edge(i[z],i[j], article=[url])

这是正在发生的事情:

第一次使用时创建边

G.add_edge(i[z],i[j], article=url)

所以这是一个字符串。但稍后当你这样做时

G[i[z]][i[j]]['article'] = temp

您已将 temp 定义为第一个元素为 G[i[z]][i[j]]['article'] 的列表。所以 G[i[z]][i[j]]['article'] 现在是一个包含两个元素的列表,第一个是 G[i[z]][i[j]]['article'] 的旧值(一个字符串),第二个是新的 url (也是一个字符串) .

您的问题出现在后面的步骤中:

从此以后,一模一样。 G[i[z]][i[j]]['article'] 又是一个包含两个元素的列表,第一个是它的旧值(一个列表),第二个是新的 url(一个字符串)。所以你有一个嵌套列表。

让我们用三个 url 来追溯:'a''b''c',我将使用 E 缩写 G[i[z]][i[j]]。第一次通过,你得到 E='a'。第二次通过你得到 E=['a', 'b']。第三次通过它给出 E=[['a','b'],'c']。所以它总是使 E[0] 成为 E 的前值,而 E[1] 成为新的 url.

两个选择:

1) 如果您有一个字符串或一个列表,您可以以不同的方式处理 temp 的创建。这是错误的选择。

2) 更好:始终将其列为一个列表,然后甚至不处理 temp。尝试将边创建为 (...,article = [url]),然后只使用 G[i[z]][i[j]]['article'].append(url) 而不是定义 temp

所以你的代码是

if G.has_edge(i[z],i[j]):
        G[i[z]][i[j]]['article'].append(url[index])
    else:
        G.add_edge(i[z],i[j], article=[url])

另一个可能会给您带来问题的是电话

del temp[:]

这应该会导致与我认为您描述的不同的行为。所以我认为这与它的实际编码方式有点不同。当您设置 G[i[z]][i[j]] = temp 然后执行 del temp[:] 时,您已经使两个列表成为一个具有两个不同名称的列表。当您 del temp[:] 时,您也在这样做 G[i[z]][i[j]]。考虑以下

temp = []
temp.append(1)
print temp
> [1]    
L = temp
print L
> [1]
del temp[:]
print L
> []