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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:47:20