使用字典在 Python 中构建自己的图表

Building own Graph in Python with Dictionary

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

我的想法有什么问题吗?

对于 "older" Python 实现,set 是无序数据结构(从 开始它使用插入顺序)。

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

但是你不需要集合,你可以 "unpack" 你的元组:

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]

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