全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何用纯 Python 实现“将列表中每个位置替换为其余元素乘积”的高效转换

该教程详解如何编写一个不依赖 numpy 的函数,对输入列表的每个索引 i,生成新列表,其中第 i 个元素被替换为除自身外所有其他元素的乘积,其余位置保持原值。

要实现“对列表中每个位置生成一个新列表,其中该位置的元素被替换为其余所有元素的乘积”,关键在于:对每个索引 i,构造一个新列表,仅修改第 i 个元素为 total_product // arr[i](前提是无零),其余元素保持不变

原始代码存在多个根本性问题:

  • results = arr 是浅拷贝,修改 results[i] 会污染原列表;
  • 每次循环都复用同一列表对象,导致后续迭代基于已被修改的数组计算;
  • 使用了 np.prod 和 np.random,违背“不使用 NumPy”的要求;
  • 未处理零值(除零错误)和整数精度问题(Python 中应优先用整除 // 避免浮点误差)。

✅ 正确思路(纯 Python,健壮高效):

  1. 预计算总乘积(若列表非空);
  2. 遍历每个索引 i,对每个 i:
    • 若 arr[i] != 0,则新值为 total_product // arr[i];
    • 若 arr[i] == 0,则其余元素乘积即为 total_product(因为 0 被跳过)——但需单独处理:此时需重新计算不含 arr[i] 的乘积;
  3. 每次构造全新列表,避免引用干扰。

以下是推荐实现(含零安全处理):

def multiList(arr):
    if not arr:
        return []

    # 处理含零情况:统计零的个数
    zeros = arr.count(0)
    if zeros > 1:
        # 多个零 → 所有位置结果都是 0(因至少一个其他元素为 0)
        return [0] * len(arr)
    elif zeros == 1:
        # 恰好一个零 → 仅零所在位置结果为其余数乘积;其余位置结果全为 0
        non_zero_prod = 1
        zero_idx = -1
        for i, x in enumerate(arr):
            if x == 0:
                zero_idx = i
            else:
                non_zero_prod *= x
        result = [0] * len(arr)
        result[zero_idx] = non_zero_prod
        return result
    else:
        # 无零 → 安全使用总乘积除法
        total_prod = 1
        for x in arr:
            total_prod *= x
        return [total_prod // x for x in arr]

# 示例调用
print([69, 78, 62, 73, 23])
print(multiList([69, 78, 62, 73, 23]))
# 输出: [8119644, 7182762, 9036378, 7674732, 24358932]

⚠️ 注意事项:

  • 必须深拷贝逻辑:每次返回的是独立新列表,不可复用原列表或中间变量;
  • 零值鲁棒性:直接 prod / arr[i] 在 arr[i]==0 时会报错或产生 inf,必须分支处理;
  • 整数精度:Python 整数无溢出,且 // 在整除时比 / 更安全(避免浮点舍入误差);
  • 时间复杂度:O(n) 预处理 + O(n) 构造结果 = O(n),优于嵌套循环的 O(n²)。

? 进阶提示:若需返回所有变换后的列表组成的二维列表(即每个 i 对应一个完整列表,共 n 个列表),可封装为:

def all_multi_lists(arr):
    n = len(arr)
    if n == 0:
        return []
    # 先按上述逻辑计算单个结果(用于无零/单零场景)
    base_result = multiList(arr)
    # 但题目要求“每个位置交换为其余乘积”,即输出 shape=(n, n) 的二维列表
    # 更高效做法:预计算前缀积 & 后缀积(O(n) 时间,O(1) 额外空间,无除法)
    if 0 not in arr:
        prefix = [1] * n
        suffix = [1] * n
        for i in range(1, n):
            prefix[i] = prefix[i-1] * arr[i-1]
        for i in range(n-2, -1, -1):
            suffix[i] = suffix[i+1] * arr[i+1]
        return [[prefix[i] * suffix[i] for i in range(n)]]
    else:
        # 含零时用朴素方法(小数据可接受)
        res = []
        for i in range(n):
            prod = 1
            for j, x in enumerate(arr):
                if j != i:
                    prod *= x
            row = arr.copy()
            row[i] = prod
            res.append(row)
        return res

综上,核心是理解题意本质:每个输出列表只改一个位置,且该位置值 = 其余元素乘积。坚持“每次新建列表 + 分类处理零值 + 避免浮点除法”,即可写出清晰、健壮、符合要求的纯 Python 解决方案。


# python  # app  # elif 


相关文章: 免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  制作网站的软件免费下载,免费制作app哪个平台好?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  相册网站制作软件,图片上的网址怎么复制?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  网站制作软件有哪些,制图软件有哪些?  c# 服务器GC和工作站GC的区别和设置  制作网站的公司有哪些,做一个公司网站要多少钱?  香港服务器部署网站为何提示未备案?  婚礼视频制作网站,学习*后期制作的网站有哪些?  重庆市网站制作公司,重庆招聘网站哪个好?  如何高效搭建专业期货交易平台网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何快速生成可下载的建站源码工具?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何高效完成自助建站业务培训?  C++如何编写函数模板?(泛型编程入门)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何在七牛云存储上搭建网站并设置自定义域名?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  网站制作免费,什么网站能看正片电影?  如何用AWS免费套餐快速搭建高效网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  香港服务器如何优化才能显著提升网站加载速度?  如何在IIS中新建站点并配置端口与物理路径?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站主机与服务器功能差异如何区分?  如何快速搭建支持数据库操作的智能建站平台?  如何通过老薛主机一键快速建站?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  青岛网站建设如何选择本地服务器?  山东云建站价格为何差异显著?  如何在宝塔面板中创建新站点?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何解决ASP生成WAP建站中文乱码问题?  建站之星好吗?新手能否轻松上手建站?  如何用IIS7快速搭建并优化网站站点?  孙琪峥织梦建站教程如何优化数据库安全?  高防服务器租用指南:配置选择与快速部署攻略  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  如何在Golang中指定模块版本_使用go.mod控制版本号  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何快速完成中国万网建站详细流程?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站主机空间推荐 高性价比配置与快速部署方案解析  魔方云NAT建站如何实现端口转发?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。