首页 > 解决方案 > 使用字典在 Python 中构建自己的图形

问题描述

我试图在 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]}

我的想法有什么问题?

标签: pythongraph-theory

解决方案


对于“较旧”的 Python 实现, aset是无序的数据结构(从开始,它使用插入顺序)。

这意味着如果您将一个元素添加到一个集合中,.pop()您可以按任何顺序检索这些元素。因此,在这里您插入例如(1, 50),但您将其检索为50and 1

但是你不需要一个集合,你可以“解包”你的元组:

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

或者如果您的元组可以包含更多元素,我们可以在这里使用例如islice(..)

from itertools import islice

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

通过迭代,我们还可以获取各种集合(本身不可下标)。


推荐阅读