python - 使用字典在 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]}
我的想法有什么问题?
解决方案
对于“较旧”的 Python 实现, aset
是无序的数据结构(从python-3.7开始,它使用插入顺序)。
这意味着如果您将一个元素添加到一个集合中,.pop()
您可以按任何顺序检索这些元素。因此,在这里您插入例如(1, 50)
,但您将其检索为50
and 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]
通过迭代,我们还可以获取各种集合(本身不可下标)。
推荐阅读
- javascript - 如果我使一个 dialog() 可拖动,并使可放置将其 innerHTML 更改为可拖动元素的 innerHTML,则 innerHTML 为“CLOSE”。为什么?
- python - 组合多索引数据框中的列
- python - TypeError:只有大小为 1 的数组可以转换为 Python 标量 Numpy
- excel - 在 vba 中使用 Match 函数的 if 语句
- cors - 在 Uno Platform WebAssembly 上下载一个大文件
- sql-server - 在日志中获取太多打开的文件错误
- java - 如何在 toast 中设置重力,我可以更改警报对话框的位置吗?
- flutter - pub.dev 将用户/贡献者/上传者添加到包中
- web - 为什么我在通过 Github 存储库在 Heroku 上托管我的网站时出错?
- github - 这些文件是如何不断更新的?