2012-05-07 3 views
1

Если я хочу получить имя по верху id, я могу использовать эту функцию: VAS(g, "name",id) , но если я хочу обратный путь, чтобы получить идентификатор по имени, как я могу это сделать?Как получить идентификатор вершины по имени?

+0

Я никогда не использовал 'igraph', но поскольку никто не ответил: после быстрой проверки документации я думаю, что я прав, говоря, что' VAS' ищет атрибут для вершины в граф. Если ваш вопрос заключается в том, как найти идентификатор вершин (или вершин) с определенным значением для указанного атрибута, то я думаю, вы можете выполнять итерацию по всем вершинам в графе, проверять атрибут и накапливать список вершин, которые соответствуют критерий. –

ответ

1

igraph не дает, само по себе, средство для поиска вершин по имени, и по уважительной причине - отображение из названия к ID является более сложной задачей, чем преобразование из ID в имени, которое простая операция поиска массива. Вы можете выполнять итерацию по всем вершинам и останавливаться на совпадении, но это неэффективно для больших графов (O (n) в числе вершин). Более быстрый способ - использовать какую-то структуру данных ассоциативного массива, например dict в ответе @ Jasc, и использовать имена как ключи и идентификаторы как значения. (Вам нужно будет поддерживать этот индекс синхронно с графиком, если вы его измените.) C сам по себе или стандартная библиотека C не предоставляют такую ​​структуру данных, но доступно много реализаций, например, GHash structure, найденный в бойкий.

+0

+1; это именно то, что я написал бы как один из авторов igraph. Я бы добавил только, что можно заменить обработчик атрибутов по умолчанию для igraph, поэтому OP теоретически расширит механизм обработки атрибутов по умолчанию igraph, чтобы он автоматически поддерживал обратное сопоставление имен с идентификаторами. Но это не реализовано в основной библиотеке. –

+0

Хорошо, большое спасибо за ваши комментарии, я попробую – user1310873

0

Я нашел следующее на веб-сайте igrah или в списке рассылки.

g = igraph.Graph(0, directed=True) 
g.add_vertices(2) 
g.vs[0]["name"] = "Bob" 
g.vs[1]["name"] = "Bill" 
# build a dict for all vertices to lookup ids by name 
name2id = dict((v, k) for k, v in enumerate(g.vs["name"])) 
# access specific vertices like this: 
id_bob = name2id["Bob"] 
print(g.vs[id_bob]["name"]) 
+0

Это похоже на Python, и он выглядит неплохо, но оригинальный плакат отметил вопрос «C» или «C++» – gcbenison

Смежные вопросы