如何提取Python二维列表中同引用可变子列表的分组索引
Python二维列表同引用子列表分组提取方法
问题背景
- Python中的列表是可变数据类型,当二维列表内存在多个位置引用同一可变子列表对象时,修改任意一个位置的子列表内容会同步反映到所有同引用位置。
- 测试场景构造逻辑:
- 首先创建包含9个独立子列表的二维列表
lst,初始状态下每个子列表调用id()返回的标识互不相同,修改单个子列表内容不会影响其他子列表。 - 通过
random.sample(range(9), 9)生成乱序索引序列indcs,调用自定义mutables函数处理lst:遍历传入的索引序列,依次将后一个索引位置的子列表引用指向当前索引位置的子列表,同时将当前子列表存储的数值加1。 - 分三段处理完所有索引后,
lst内形成3组、每组3个指向同一子列表对象的分组。此时lst内仅存在3个不同的子列表id,同组子列表id完全一致;修改组内任意子列表存储的整数值,同组所有位置的取值会同步更新,且子列表id不会随内部整数值的修改发生变化。
- 首先创建包含9个独立子列表的二维列表
核心问题
在不依赖原始索引变量
indcs、也不参考初始分组切片规则的前提下,如何仅基于lst本身的特性提取每个同引用分组对应的下标集合(如示例中的(2,4,8)、(0,5,7)、(1,3,6))?已知可通过id()获取对象的唯一标识,但现有通过id反查对象的方法仅能返回对象值,无法获取列表中所有引用该对象的位置索引,是否存在合理的实现路径?
实现方案
不需要做id反查对象的操作,直接遍历列表枚举下标和对应子列表,以子列表的id作为分组键归集下标即可,实现逻辑如下:
from collections import defaultdict def extract_ref_groups(two_dim_lst): group_map = defaultdict(list) for index, sub_lst in enumerate(two_dim_lst): group_map[id(sub_lst)].append(index) return [tuple(indexes) for indexes in group_map.values()]
方案说明
- 该实现完全依赖输入的二维列表本身,不需要任何构造列表时的中间变量,符合问题约束
- Python中同引用的对象
id()返回值全局唯一,且可变对象内部值修改不会改变自身id,分组结果不会受子列表内容修改的影响 - 整体时间复杂度为O(n)(n为二维列表一级元素个数),无额外性能损耗
内容的提问来源于stack exchange,提问作者Yerbol Sapar
相关产品推荐
相关产品推荐

