Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 从三元组网络X添加边_Python 2.7_Networkx - Fatal编程技术网

Python 2.7 从三元组网络X添加边

Python 2.7 从三元组网络X添加边,python-2.7,networkx,Python 2.7,Networkx,我正在尝试使用networkx创建一个有向图。我想使用add_edges\u from(),我想从三个元组生成边及其数据 我正在从CSV文件导入数据。我有三列:一列用于ID(第一组节点),一列用于名称集(第二组节点),另一列用于容量(文件中没有标题)。因此,我为ID和容量创建了一个字典 dictionary = dict(zip(id, capacity)) 然后我压缩了包含边数据的元组: List = zip(id, name, capacity) 但是当我执行下一行时,它会给我一个断言错

我正在尝试使用networkx创建一个有向图。我想使用
add_edges\u from()
,我想从三个元组生成边及其数据

我正在从CSV文件导入数据。我有三列:一列用于ID(第一组节点),一列用于名称集(第二组节点),另一列用于容量(文件中没有标题)。因此,我为ID和容量创建了一个字典

dictionary = dict(zip(id, capacity))
然后我压缩了包含边数据的元组:

List = zip(id, name, capacity)
但是当我执行下一行时,它会给我一个断言错误

G.add_edges_from(List, 'weight': 1)
有人能帮我解决这个问题吗?我已经试了一个星期,运气不好

另外,我是个编程新手

编辑:

因此,我找到了以下解决方案。老实说,我不知道它是如何工作的,但它做到了! 代码如下:

import networkx as nx
import csv
G = nx.DiGraph()
capacity_dict = dict(zip(zip(id, name),capacity))
List = zip(id, name, capacity)
G.add_edges_from(capacity_dict, weight=1)
for u,v,d in List:
    G[u][v]['capacity']=d
现在当我跑步时:

G.edges(data=True)
结果将是:

[(2.0, 'First', {'capacity': 1.0, 'weight': 1}), (3.0, 'Second', {'capacity': 2.0, 'weight': 1})]

我正在使用网络单工。现在,我正试图找到一种方法使flowDict的输出更容易理解,因为它只显示流的ID。(也许我会尝试将它们输入数据库并返回整行数据,而不是仅使用ID)。

对您的版本进行一些改进。(1) NetworkX算法假定权重为1,除非您专门将其设置为不同的值。因此,在您的案例中不需要显式地设置它。(2) 使用generator允许显式设置capacity属性,并且每个记录还可以设置一次其他属性。(3) 使用生成器在每个记录通过时对其进行处理,可以避免在整个列表中迭代两次。在小型数据集上,性能改进可能可以忽略不计,但仍然让人感觉更加优雅。话虽如此,你的方法显然有效

import networkx as nx
import csv

# simulate a csv file.
# This makes a multi-line string behave as a file.
from StringIO import StringIO
filehandle = StringIO('''a,b,30
b,c,40
d,a,20
''')

# process each row in the file
# and generate an edge from each
def edge_generator(fh):
    reader = csv.reader(fh)
    for row in reader:
        row[-1] = float(row[-1]) # convert capacity to float
        # add other attributes to the dict() below as needed...
        # e.g. you might add weights here as well.
        yield (row[0], 
               row[1], 
               dict(capacity=row[2]))

# create the graph
G = nx.DiGraph()
G.add_edges_from(edge_generator(filehandle))

print G.edges(data=True)
返回以下内容:

[('a', 'b', {'capacity': 30.0}), 
 ('b', 'c', {'capacity': 40.0}), 
 ('d', 'a', {'capacity': 20.0})]

嗨,谢谢你的回答。我刚刚找到了解决办法。我把它加在我的问题下面。问题是我不想添加加权边。我想从元组中添加容量。这些边的权重值始终为1。区别在于容量。我确信有比我更有效的解决方案,但它确实起到了作用:)你的方法显然有效。我已经修改了我的版本,使之更符合NetworkX的习惯用法,并且仍然能够提供您需要的答案。希望它能帮助您在未来探索
nx
+1时找到自己的答案。”“权重”不需要指定为NetworkX算法,如果未明确设置,则假定所有权重均为1。另请参阅我对自己版本的编辑。为问题添加答案并非如此,即使是您自己的答案。最好写一个完整的答案并接受它。