You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤图节点处理结果中的单元素元组(1-tuple)?

过滤列表中的单元素元组,保留二元组与三元组

在处理图节点坐标时,生成的列表中混杂了单元素、二元及三元组,我们需要仅保留二元组(2-tuple)和三元组(3-tuple),过滤掉所有单元素元组(如(40,))。

原代码

G=nx.read_shp(r'C:\TestData\tl_2019_36013_roads.shp')
pos = {k: v for k,v in enumerate(G.nodes())}
X=nx.Graph() #Empty graph
X.add_nodes_from(pos.keys()) #Add nodes preserving coordinates
edg=[tuple(k for k,v in pos.items() if v in sl) for sl in l]
print(edg)

当前输出示例

[(38, 9848), (40, 41), (40,), (10, 42)]

解决方案

直接在生成列表的逻辑中加入长度判断,只保留长度为2或3的元组,有两种实用写法:

写法1:列表推导式内高效过滤(Python 3.8+)

利用海象运算符:=避免重复生成元组计算长度,更高效:

G=nx.read_shp(r'C:\TestData\tl_2019_36013_roads.shp')
pos = {k: v for k,v in enumerate(G.nodes())}
X=nx.Graph() #Empty graph
X.add_nodes_from(pos.keys()) #Add nodes preserving coordinates
edg=[t for sl in l if len(t := tuple(k for k,v in pos.items() if v in sl)) in (2,3)]
print(edg)

写法2:分步循环(兼容低版本Python)

如果你的Python版本低于3.8,分步循环逻辑更清晰直观:

G=nx.read_shp(r'C:\TestData\tl_2019_36013_roads.shp')
pos = {k: v for k,v in enumerate(G.nodes())}
X=nx.Graph() #Empty graph
X.add_nodes_from(pos.keys()) #Add nodes preserving coordinates
edg = []
for sl in l:
    current_tuple = tuple(k for k,v in pos.items() if v in sl)
    if len(current_tuple) in (2, 3):
        edg.append(current_tuple)
print(edg)

两种写法处理后,输出都会变为:

[(38, 9848), (40, 41), (10, 42)]

内容的提问来源于stack exchange,提问作者PythonN00b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:55:30