Я хочу добавить клик к моему графику в качестве подграфа - PullRequest
0 голосов
/ 02 июля 2019

У меня есть Graph класс:

class Graph:
    V = set([])
    E = {}

    def add_vertex(self, u):
        self.V.add(u)
        self.E[u] = []

    def add_edge(self, u, v):
        if u not in self.V:
            self.add_vertex(u)
        if v not in self.V:
            self.add_vertex(v)
        self.E[u].append(v)
        self.E[v].append(u)

    def add_clique(self, *Q):
        for u, v in Q:
            self.add_edge(u, v)

функция add_clique должна принимать произвольное количество элементов по отдельности или в виде списка и добавлять их в график в виде клики (завершеноsubgraph).

Итак, приведенный ниже код должен работать:

G = Graph()
G.add_clique(1,2,3,4)
list = [5,6,7,8,9]
G.add_clique(*list)
G.add_clique(*[13,14,19,21])

Однако я не могу просмотреть список или набор аргументов в парах.Когда я выполняю этот код:

G = Graph()
G.add_clique(5, 6, 7, 8)

Я получаю эту ошибку:

Traceback (most recent call last):
  File "D:/PycharmProjects/disks/main.py", line 63, in <module>
    G.add_clique(5, 6, 7, 8)
  File "D:/PycharmProjects/disks/main.py", line 21, in add_clique
    for u, v in Q:
TypeError: cannot unpack non-iterable int object

Как правильно это сделать?

1 Ответ

1 голос
/ 02 июля 2019

Обычно ваш цикл for в add_clique пытается прочитать 2 элемента из каждого элемента Q. for u, v in Q распаковывает каждый элемент в две переменные, это работает, только если каждый элемент точно 2-кортеж. Вы можете воспроизвести это, запустив следующее в оболочке Python

>>> for u, v in (1, 2, 3, 4):
...   pass

Для вашего варианта использования подграфа, проверьте itertools.combination , чтобы получить все 2 кортежа из списка узлов. Код может быть таким простым, как

for u, v in itertools.combinations(Q, 2):
    self.add_edge(u, v)
...