Python中定位子列表在另一列表中的位置报错解决
问题描述
我有两个列表G3、G333,想要定位G333中的子列表在G3中的位置并打印索引i。例如,[0, 4, 5, 9]在G3的i=0位置,[10, 14, 15, 19]在G3的i=5位置,但运行代码时出现错误。
相关代码
G3=[[0, 4, 5, 9], [1, 5, 6, 10], [2, 6, 7, 11], [3, 7, 8, 12], [9, 13, 14, 18], [10, 14, 15, 19]] G333=[[0, 4, 5, 9], [1, 5, 6, 10], [10, 14, 15, 19]] G3s = set(map(tuple, G3)) G333s = set(map(tuple, G333)) for i in range(0,len(G3s)): if (G3s[i] & G333s[i]): print(i)
错误信息
in <module> if (G3s[i] & G333s[i]): TypeError: 'set' object is not subscriptable
预期输出
i=[0,1,5]
解决方案
问题原因
你把列表转成集合后,试图用下标[i]访问集合元素,但集合是无序结构,不支持下标访问,这才抛出了TypeError。同时你的逻辑也有误:集合的&是求交集操作,不是判断元素是否存在的正确方式。
正确实现方式
这里提供两种高效的实现思路:
思路1:遍历原列表,判断子列表是否在目标集合中
G3=[[0, 4, 5, 9], [1, 5, 6, 10], [2, 6, 7, 11], [3, 7, 8, 12], [9, 13, 14, 18], [10, 14, 15, 19]] G333=[[0, 4, 5, 9], [1, 5, 6, 10], [10, 14, 15, 19]] # 把G333转成集合(列表不能哈希,转成tuple) g333_set = set(map(tuple, G333)) result = [] for idx, sublist in enumerate(G3): if tuple(sublist) in g333_set: result.append(idx) print(f"i={result}")
思路2:建立子列表到索引的映射,批量查找
如果G3数据量很大,这种方式查找效率更高:
G3=[[0, 4, 5, 9], [1, 5, 6, 10], [2, 6, 7, 11], [3, 7, 8, 12], [9, 13, 14, 18], [10, 14, 15, 19]] G333=[[0, 4, 5, 9], [1, 5, 6, 10], [10, 14, 15, 19]] # 构建子列表(转tuple)到对应索引的字典 sublist_to_idx = {tuple(sublist): idx for idx, sublist in enumerate(G3)} # 遍历G333,取出每个子列表对应的索引 result = [sublist_to_idx[tuple(s)] for s in G333] print(f"i={result}")
两种方式运行后都会输出预期结果:i=[0,1,5]
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

