2016-04-23 7 views
1

Узлы моих графиков являются экземплярами, которые имеют некоторые методы. Я правильно добавил узлы, но теперь хочу проверить, для тех узлов, если они имеют один и тот же group_id, add_edges. Я использую igraphКак добавить ребра, связанные с атрибутом объекта с помощью igraph и python

import igraph as ig 

def making_graph(researchers): 
    g = ig.Graph() 
    for each in researchers: 
     for i in range(len(each)): 
      g.add_vertex(each[i]) 
      g.vs[i]['researcher_id'] = each[i].get_researcher_id() 
      g.vs[i]['name'] = each[i].get_name() 
      g.vs[i]['sex'] = each[i].get_sex() 

    g.add_edges() # if researchers have the same group_id, add edge 
    return g 

Класс для исследователя

class Researcher: 

    def __init__(self, group_id, research_id, name, tit, sex, 
      tot_nac_2011, tot_nac_2014, tot_int_2011, tot_int_2014, tot_bbl_2011, tot_bbl_2014): 

     self.group_id = group_id 
     self.research_id = research_id 
     self.name = name 
     self.tit = tit 
     self.sex = sex 
     self.producao = [tot_nac_2011, tot_nac_2014, tot_int_2011, tot_int_2014, tot_bbl_2011, tot_bbl_2014] 

    def get_group_id(self): 
     return self.group_id 

    def get_researcher_id(self): 
     return self.research_id 

    def get_sex(self): 
     return self.sex 

и когда я называю making_graph я прохожу список со списком исследователей

отредактирован. Это также не работает. Зачем?

def making_graph(researchers): 
    g = ig.Graph() 
    for each in researchers: 
     for i in range(len(each)): 
      g.add_vertex(each[i]) 
      g.vs[i]['researcher_id'] = each[i].get_researcher_id() 
      g.vs[i]['name'] = each[i].get_name() 
      g.vs[i]['sex'] = each[i].get_sex() 
      for other in researchers: 
       for j in range(len(other)): 
        if each[i].get_group_id() == other[j].get_group_id(): 
         g.add_edge([(g.vs[i], g.vs[j])]) 
return g 
+0

Означают ли вы, если _все_ исследователи имеют тот же 'group_id'? –

+0

Для этого конкретного случая да. Но когда я собираю больше графиков (106 000), мне нужно будет получить доступ к узлу метода researchcher.get_group_id(), и если он будет тем же самым из другого узла, то add_edge (researchcher1, researchcher2) –

+0

Один шаг за раз. Вы можете проверить [этот вопрос] (http://stackoverflow.com/questions/3844801/check-if-all-elements-in-a-list-are-identical). –

ответ

0

Теперь, кажется, это работа:

def making_graph(researchers): 
    g = ig.Graph() 
    for each in researchers: 
     for i in range(len(each)): 
      g.add_vertex(each[i]) 
      g.vs[i]['group_id'] = each[i].get_group_id() 
      g.vs[i]['researcher_id'] = each[i].get_researcher_id() 
      g.vs[i]['name'] = each[i].get_name() 
      g.vs[i]['sex'] = each[i].get_sex() 
    for v in g.vs: 
     for w in g.vs: 
      if v['group_id'] == w['group_id'] and v != w and g.are_connected(v, w) is False: 
       g.add_edge(v, w) 
    return g