如何过滤图节点处理结果中的单元素元组(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
相关产品推荐
相关产品推荐

