来自networkx的g.nodes()无法使用random.choice()

时间:2018-02-03 14:16:05

标签: python networkx

我正在尝试在随机节点之间生成随机边缘,但代码行ab=choice(G.nodes())正在生成错误。

import networkx as nx
import matplotlib.pyplot as plt
from random import choice
G=nx.Graph()
city_set=['a','b','c','d','e','f','g','h']
for each in city_set:
    G.add_node(each)
ab=choice(G.nodes())
print(ab)

错误

  

C:\用户\ DELL \ Anaconda2 \ ENVS \名字\ python.exe   C:/Users/DELL/Documents/PythonPrograms/Beginning/ntwxproject.py   Traceback(最近一次调用最后一次):        文件“C:/Users/DELL/Documents/PythonPrograms/Beginning/ntwxproject.py”,   第10行,在          AB =选择(G.nodes())        文件“C:\ Users \ DELL \ Anaconda2 \ envs \ untitled \ lib \ random.py”,第259行,在选择中       return seq [i] File“C:\ Users \ DELL \ Anaconda2 \ envs \ untitled \ lib \ site-packages \ networkx \ classes \ reportviews.py”,   第178行, getitem        return self._nodes [n] KeyError:1

     

使用退出代码1完成处理

我是python的新手,帮助我。

3 个答案:

答案 0 :(得分:0)

由于不是100%明确您接下来要做什么,我尝试提供一些关于如何将random.choice()与您的城市列表结合使用的提示(请注意它' sa"列表",而不是"设置" - 更好的标识符将是city_list。

编辑:我看到你添加了一些信息 - 所以我添加了一种构建边缘的方法......

您的主要问题是,G.nodes()<class 'networkx.classes.reportviews.NodeView'>而不是简单列表(即使其字符串表示看起来像列表)。

import networkx as nx 
import matplotlib.pyplot as plt 
import random 

G=nx.Graph() 
city_list=['a','b','c','d','e','f','g','h']

# this is a bit easier then adding each node in a loop 
G.add_nodes_from(city_list)

# show type and content of G.nodes() 
print(G.nodes())
print(type(G.nodes()))

# based on your old code:    
for _ in city_list: 
    ab=random.choice(city_list) 
    print(ab)
print("list is now", city_list)

# generate n random edges
n=5
for _ in range(n):
    # random.sample(city_list, 2) gives a 2-tuple from city list
    # The '*'-operator unpacks the tuple to two input values for the .add_edge() method
    G.add_edge(*random.sample(city_list, 2))
print("Edges generated:", G.edges())

我希望这有点帮助...

答案 1 :(得分:0)

通过传递list(G.nodes())而不是G.nodes(),可以将G.nodes()转换为与random.choice()兼容的列表格式。

<head>

答案 2 :(得分:0)

G.node的使用已由networkx 2.4版中的G.nodes代替。

因此,如果您尝试取消使用G.node作为密钥标识符的旧代码,则可能会遇到此错误。

将所有G.node替换为G.node,反之亦然。根据您尝试的版本。

enter image description here