Построение собственного графа на Python со словарем - PullRequest
0 голосов
/ 29 октября 2018

Я пытался построить собственный граф в Python. Словари идеально подходят для этого, но я думаю, что использовать их глупо.

def add_edge(gra, edge):

        edge = set(edge)
        vertex1 = edge.pop()
        if edge:

            vertex2 = edge.pop()
        else:

            vertex2 = vertex1
        if vertex1 in gra:
            gra[vertex1].append(vertex2)
        else:
            gra[vertex1] = [vertex2]

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

z = {0:[],1:[],2:[],3:[],4:[],5:[]}

for i in range(0,6):
    add_edge(z,(i,50))
print(z)

я бы за исключением того, что он добавил бы:

{0:[50],1:[50],2:[50],3:[50],4:[50],5:[50]}

но я получаю:

{0: [50], 1: [50], 2: [50], 3: [], 4: [], 5: [], 50: [3, 4, 5]}

что не так с моей идеей?

1 Ответ

0 голосов
/ 29 октября 2018

Для "старых" реализаций Python set - это неупорядоченная структура данных (для используется порядок вставки).

Это означает, что если вы добавляете элемент в набор, с помощью .pop() вы можете получить элементы в любом порядке. Здесь вы вставляете, например, (1, 50), но возвращаете его как 50 и 1.

Но вам все равно не нужен набор, вы можете просто «распаковать» ваш кортеж:

def add_edge(gra, edge):
    <b>vertex1, vertex2 = edge</b>
    if vertex1 in gra:
        gra[vertex1].append(vertex2)
    else:
        gra[vertex1] = [vertex2]

или если ваш кортеж может содержать больше элементов, мы можем использовать, например, islice(..) здесь:

from itertools import islice

def add_edge(gra, edge):
    <b>vertex1, vertex2 = islice(edge, 2)</b>
    if vertex1 in gra:
        gra[vertex1].append(vertex2)
    else:
        gra[vertex1] = [vertex2]

Итерируя, мы можем также взять все виды коллекций (которые сами по себе не являются приемлемыми).

...