2014-01-22 1 views
7

Для данного графа g я не могу изменить отдельные вершины Attribué (в данном случае 'color'):Изменение indivual вершинных атрибутов питона igraph

from igraph import Graph 

# create triangle graph 
g = Graph.Full(3) 

cl_blue = (0,0,.5) 
cl_red = (.5,0,0) 

g.vs['color'] = 3*[cl_blue] 
g.vs['color'][0] = cl_red 

после Поступая таким образом, print g.vs['color'] все еще дает

[(0, 0, 0.5), (0, 0, 0.5), (0, 0, 0.5)] 

Как назначить значения для отдельных элементов?

ответ

6

Вы просто делаете это в обратном направлении ... сделать

g.vs[0]['color'] = cl_red 

извините, должно быть более описательный характер.

g.vs['color'] возвращает список всех атрибутов узла. Это не фактические атрибуты - это копия, поэтому ее изменение не имеет никакого эффекта.

g.vs[0] возвращает фактическую вершину 0. Затем вы можете изменить ее атрибуты с помощью интерфейса словаря.

+0

Большое спасибо! Однако я не понимаю вашего полного объяснения. Если 'g.vs ['color']' возвращает только «копию, поэтому ее изменение не имеет никакого эффекта», то как я могу назначить ее «g.vs ['color'] = 3 * [cl_blue]' в приведенный выше пример? – flonk

+0

ОК, я думаю, это не совсем верно ... объяснение требует немного больше. Когда вы вызываете 'g.vs ['color'] = 3 * [cl_blue]', это приводит к действительно вызову 'g.vs .__ setitem __ ('color', 3 * [cl_blue])', который VertexSequence может перевести в настройка атрибутов для всех узлов. 'g.vs ['color'] [0]' превращается в вызов 'g.vs .__ getitem __ ('color')', который возвращает список (копия), а затем '[0]' либо позволяет вы устанавливаете первый элемент в этом скопированном списке или уважаете его. –

+0

Спасибо за ваше объяснение. Я не должен был недооценивать сложность '=', который магически называет '__setitem__'. – flonk