从图元组输入提取边集:Python程序问题问询
嘿,我来帮你排查下这个Python程序的问题,一眼看下来有两个关键的逻辑错误,咱们一步步拆解:
问题分析
1. 遍历对象完全错了
你写的for i in G[1]是在遍历输入列表G的第二个元素(也就是({'a', 'c'}, 6)这个元组),而不是遍历整个G列表。这就导致你的循环只会处理这个元组里的两个值:边集合{'a','c'}和权重6,直接把其他所有边的数据都忽略了,这肯定不是你想要的。
2. 集合不能用下标访问
Python里的set(集合)是无序且不支持下标操作的,当你尝试执行i[0]时,如果i是一个集合(比如{'a','b'}),会直接抛出TypeError: 'set' object is not subscriptable的错误。而且从你的输入结构来看,每个元组的第一个元素本身就是你需要的边集合,根本不需要去取什么索引。
另外,当循环到权重数字(比如6)时,执行i[0]同样会报错,因为整数也没有下标属性。
修复后的代码
我们只需要修正这两个问题:遍历整个G列表,直接提取每个元组的第一个元素(也就是边集合):
def edges(G): E = [] # 遍历整个输入列表,每个item是(边集合, 权重)的元组 for edge_item in G: # 直接取元组的第一个元素,就是我们要的边集合 E.append(edge_item[0]) return E # 测试你的输入 G = [({'a', 'b'}, 4), ({'a', 'c'}, 6), ({'a', 'd'}, 8), ({'b', 'e'}, 1) , ({'b', 'f'}, 9), ({'c', 'f'}, 3), ({'d', 'g'}, 7), ({'d', 'h'}, 0)] print(edges(G))
运行结果
修复后运行代码,就能得到完整的边集合列表了:
[{'a', 'b'}, {'a', 'c'}, {'a', 'd'}, {'b', 'e'}, {'b', 'f'}, {'c', 'f'}, {'d', 'g'}, {'d', 'h'}]
可选的简洁写法
如果想让代码更精炼,可以用Python的列表推导式一行搞定,效果完全一样:
def edges(G): return [item[0] for item in G]
这样既清晰又高效,完美解决你的需求~
内容的提问来源于stack exchange,提问作者user9713961
相关产品推荐
相关产品推荐

