列表中基于计算索引交换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
相关产品推荐
相关产品推荐

