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

列表中基于计算索引交换0和1时反向操作失效的原因排查

问题分析:列表0和1交换代码的执行逻辑

问题描述

我编写了一段用于交换列表中0和1的代码:

b["".join(b).rfind("0")], b["".join(b).find("1")] = b["".join(b).find("1")], b["".join(b).rfind("0")]

当列表b为["1","0","1","1","1","1"]时,能正常交换为["0","1","1","1","1","1"];但若以该结果作为初始列表执行代码,列表却保持不变。想了解代码的内部机制,为何0只能从右向左交换,无法从左向右交换?

代码执行逻辑拆解

  • 首先,"".join(b)将列表元素拼接成字符串,比如初始列表会变成"101111"
  • .rfind("0"):从字符串末尾往左查找第一个"0"的索引,初始列表中"0"在索引1,因此返回1
  • .find("1"):从字符串开头往右查找第一个"1"的索引,初始列表中第一个"1"在索引0,因此返回0
  • 最终执行的是b[1], b[0] = b[0], b[1],也就是交换索引0和1的元素,得到预期结果

第二次执行无变化的原因

当列表变为["0","1","1","1","1","1"]时:

  • 拼接后的字符串是"011111"
  • .rfind("0")从末尾找"0",找到的索引是0
  • .find("1")从开头找"1",找到的索引是1
  • 执行交换b[0], b[1] = b[1], b[0],交换后元素还是"0"和"1",列表自然保持不变

为什么只能从右向左交换0?

因为你用了rfind("0")方法,这个方法的特性就是从右往左查找第一个匹配的元素,只会定位到最右侧的"0"(如果有多个0的话)。如果想要定位最左侧的"0",需要换成find("0");如果想要交换最左侧的0和最右侧的1,代码可以改成:

b["".join(b).find("0")], b["".join(b).rfind("1")] = b["".join(b).rfind("1")], b["".join(b).find("0")]

比如用["0","1","1","1","1","1"]执行这段代码,会交换索引0和5的元素,得到["1","1","1","1","1","0"]


内容的提问来源于stack exchange,提问作者dragonfly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:55:06