全网整合营销服务商

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

免费咨询热线: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 


相关文章: 贸易公司网站制作流程,出口贸易网站设计怎么做?  如何在建站之星绑定自定义域名?  ,购物网站怎么盈利呢?  如何通过FTP服务器快速搭建网站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  微课制作网站有哪些,微课网怎么进?  香港服务器租用费用高吗?如何避免常见误区?  javascript中对象的定义、使用以及对象和原型链操作小结  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何快速上传建站程序避免常见错误?  如何彻底卸载建站之星软件?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  网站制作的步骤包括,正确网址格式怎么写?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  高防服务器:AI智能防御DDoS攻击与数据安全保障  建站之星会员如何解锁更多建站功能?  如何做网站制作流程,*游戏网站怎么搭建?  如何通过WDCP绑定主域名及创建子域名站点?  如何在IIS7上新建站点并设置安全权限?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  网站企业制作流程,用什么语言做企业网站比较好?  如何生成腾讯云建站专用兑换码?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  家具网站制作软件,家具厂怎么跑业务?  制作表格网站有哪些,线上表格怎么弄?  如何通过VPS搭建网站快速盈利?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  微信小程序 input输入框控件详解及实例(多种示例)  如何在宝塔面板中创建新站点?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何用PHP快速搭建CMS系统?  如何快速搭建高效服务器建站系统?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何挑选高效建站主机与优质域名?  建站之星在线客服如何快速接入解答?  网站网页制作专业公司,怎样制作自己的网页?  linux top下的 minerd 木马清除方法  建站主机类型有哪些?如何正确选型  阿里云网站制作公司,阿里云快速搭建网站好用吗?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何挑选最适合建站的高性能VPS主机?  浅析上传头像示例及其注意事项  制作网站的软件免费下载,免费制作app哪个平台好? 

您的项目需求

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