首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >得到二元组的相反元素

得到二元组的相反元素
EN

Stack Overflow用户
提问于 2021-12-15 19:30:34
回答 2查看 95关注 0票数 0

目前有一段代码如下所示

代码语言:javascript
运行
复制
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是否是邻接列表中元组的一个元素,并分配相反的元素。本质上,这是无向图的邻接矩阵。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-15 19:42:55

也许使用index()方法:

代码语言:javascript
运行
复制
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是否位于当前边缘的端点集合中。

票数 1
EN

Stack Overflow用户

发布于 2021-12-15 19:45:21

你当然可以折叠代码。这一行执行与整个for + if块相同的操作。然而,这是否是最毕达通,是值得怀疑的,因为可读性很重要,这是相当紧凑的。

代码语言:javascript
运行
复制
adjacent = [x[int(node['id'] == x[0])] for x in edges if node['id'] in x]

妥协可能是这样的。它保留了一些快捷方式,但将其放置在更大的空间上,以保持事物的可读性。

代码语言:javascript
运行
复制
for edge in edges:
    if node['id'] in edge:
        index = int(node['id'] == x[0])
        adjacent.append(edge[index])

这两个代码块都可以测试元组中的第一个元素是否与节点id匹配,并将该布尔值转换为整数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70369340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档