【问题标题】:Get opposite element of 2-tuple [closed]获取2元组的相反元素[关闭]
【发布时间】:2022-01-18 23:20:42
【问题描述】:

目前有一段代码是这样的

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 是邻接表中元组的一个元素,并分配相反的元素 元素。本质上这是一个无向图的邻接矩阵。

【问题讨论】:

  • 使用可迭代解包,for x, y in edges: ...
  • 我真的不明白这如何使它更 Pythonic 或更简洁......
  • 我认为这更适合codereview.stackexchange.com
  • @zr0gravity7 可迭代解包优于索引到这样的元组。这是这里最容易实现的目标。
  • @ThomasCarroll 什么是“pythonic”是一个见仁见智的问题,这使它成为一般的代码审查和题外话。如果您担心某些目标,例如遵守 PEP-8,或者至少不使用某些 特定 实现方法(例如,没有循环),您可以改写关于这个的问题。

标签: python tuples graph-theory adjacency-matrix


【解决方案1】:

或许使用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 是否在当前边缘的端点集中。

【讨论】:

    【解决方案2】:

    您当然可以折叠代码。该行与整个 for + if 块的作用相同。然而,这是否是最 Pythonic 是值得怀疑的,因为可读性很重要,而且它非常紧凑。

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

    【讨论】:

    • 注意,从bool 转换为int 并不是绝对必要的,尽管它可能是澄清的,因为issubclass(bool, int) 是真的(虽然,我认为最终这里会调用bool.__index__
    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2022-08-05
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多