迭代地使用信息填充Networkx图

时间:2015-04-16 13:52:10

标签: python graph networkx edges

我一直在尝试开发一种图形结构,该图形结构将根据它们之间共同提到的特征链接实体,例如:如果在文章中共同提及,则有两个地方相关联。

我已设法这样做,但我一直遇到问题,用新信息迭代填充边缘,保留现有信息。

我的方法(因为我没有找到任何相关内容)是将现有信息附加到列表中,在列表中附加新链接并将该列表分配给相应的功能。

    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[:]

如上所示,由于要填充许多链接,我定义了一个专用列表(temp),加载了一个名为article的链接变量的旧内容(如果该链接不存在,我创建一个链接并添加作为第一个值,“带来”2个位置的网址。

我的问题是,当我尝试查看链接的网址时,每次清空列表以便当一个新对进入时为空时我会得到类似这样的内容:

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

似乎每次删除临时列表的内容时,我只保留最后一个链接,但是如果没有声明一组不必要的临时列表,我找不到更好的方法。

有什么想法吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

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(字符串)。所以你有一个嵌套列表。

让我们通过三个网址进行追踪:'a''b''c',我将使用E来缩写G[i[z]][i[j]]。第一次,你得到E='a'。第二次通过你获得E=['a', 'b']。第三次通过它给出了E=[['a','b'],'c']。因此,始终将E[0]设为E的前值,并将E[1]设为新网址。

两种选择:

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
> []

答案 1 :(得分:0)

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

从边缘获取现有列表时,必须使用extend而不是append。

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]