获取二元组的相反元素

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 匹配并将该布尔值转换为整数。