目前有一段代码如下所示
node = {"id": 1, "some-other-data": "foo"}
edges = [(1, 0), (2, 1)]
adjacent = []
for edg in edges:
if node["id"] == edg[0]:
adjacent.append(edg[1])
elif node["id"] == edg[1]:
adjacent.append(edg[0])我想知道是否有一种更多的'pythonic‘检查方式,以确定ID是否是邻接列表中元组的一个元素,并分配相反的元素。本质上,这是无向图的邻接矩阵。
发布于 2021-12-15 19:42:55
也许使用index()方法:
node = {"id": 1, "some-other-data": "foo"}
edges = [(1, 0), (2, 1)]
adjacent = []
for edg in edges:
try:
i = edg.index(node["id"])
adjacent.append(edg[~i])
except ValueError:
pass这里我们遵循请求宽恕的pythonic方法,并使用位否定(~)将0和1的指数分别转化为1和0。
它具有相同的运行时,因为边列表的大小是恒定的,所以它仍然是O({##**$$})。
还可以用一个简单的try/except语句替换if块,以检查节点的id是否位于当前边缘的端点集合中。
发布于 2021-12-15 19:45:21
你当然可以折叠代码。这一行执行与整个for + if块相同的操作。然而,这是否是最毕达通,是值得怀疑的,因为可读性很重要,这是相当紧凑的。
adjacent = [x[int(node['id'] == x[0])] for x in edges if node['id'] in x]妥协可能是这样的。它保留了一些快捷方式,但将其放置在更大的空间上,以保持事物的可读性。
for edge in edges:
if node['id'] in edge:
index = int(node['id'] == x[0])
adjacent.append(edge[index])这两个代码块都可以测试元组中的第一个元素是否与节点id匹配,并将该布尔值转换为整数。
https://stackoverflow.com/questions/70369340
复制相似问题