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

如何提取Python二维列表中同引用可变子列表的分组索引

Python二维列表同引用子列表分组提取方法

问题背景

  • Python中的列表是可变数据类型,当二维列表内存在多个位置引用同一可变子列表对象时,修改任意一个位置的子列表内容会同步反映到所有同引用位置。
  • 测试场景构造逻辑:
    1. 首先创建包含9个独立子列表的二维列表lst,初始状态下每个子列表调用id()返回的标识互不相同,修改单个子列表内容不会影响其他子列表。
    2. 通过random.sample(range(9), 9)生成乱序索引序列indcs,调用自定义mutables函数处理lst:遍历传入的索引序列,依次将后一个索引位置的子列表引用指向当前索引位置的子列表,同时将当前子列表存储的数值加1。
    3. 分三段处理完所有索引后,lst内形成3组、每组3个指向同一子列表对象的分组。此时lst内仅存在3个不同的子列表id,同组子列表id完全一致;修改组内任意子列表存储的整数值,同组所有位置的取值会同步更新,且子列表id不会随内部整数值的修改发生变化。

核心问题

在不依赖原始索引变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:39:13