获取二元组的相反元素
Get opposite element of 2-tuple
目前有一段代码看起来像这样
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
是邻接表中元组的一个元素并分配相反的元素
元素。本质上这是一个无向图的邻接矩阵。
也许使用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
这里我们遵循asking for forgiveness的pythonic方法,使用按位取反(~
)将索引0和1分别变成1和0。
它具有完全相同的运行时间,因为边列表的大小是常数,所以它仍然是 O(|E|)。
您还可以用简单的 if
语句替换 try/except
块,以检查节点的 ID 是否在当前边的端点集中。
你当然可以折叠代码。此行与整个 for
+ if
块的作用相同。然而,这是否是最 Pythonic 的是值得怀疑的,因为可读性很重要,而且它非常紧凑。
adjacent = [x[int(node['id'] == x[0])] for x in edges if node['id'] in x]
妥协可能看起来像这样。它保留了一些快捷方式,但布局更多 space 以保持可读性。
for edge in edges:
if node['id'] in edge:
index = int(node['id'] == x[0])
adjacent.append(edge[index])
这两个代码块都用于测试元组中的第一个元素是否与节点 ID 匹配并将该布尔值转换为整数。
目前有一段代码看起来像这样
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 是邻接表中元组的一个元素并分配相反的元素 元素。本质上这是一个无向图的邻接矩阵。
也许使用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
这里我们遵循asking for forgiveness的pythonic方法,使用按位取反(~
)将索引0和1分别变成1和0。
它具有完全相同的运行时间,因为边列表的大小是常数,所以它仍然是 O(|E|)。
您还可以用简单的 if
语句替换 try/except
块,以检查节点的 ID 是否在当前边的端点集中。
你当然可以折叠代码。此行与整个 for
+ if
块的作用相同。然而,这是否是最 Pythonic 的是值得怀疑的,因为可读性很重要,而且它非常紧凑。
adjacent = [x[int(node['id'] == x[0])] for x in edges if node['id'] in x]
妥协可能看起来像这样。它保留了一些快捷方式,但布局更多 space 以保持可读性。
for edge in edges:
if node['id'] in edge:
index = int(node['id'] == x[0])
adjacent.append(edge[index])
这两个代码块都用于测试元组中的第一个元素是否与节点 ID 匹配并将该布尔值转换为整数。