Python如何使用数字列表作为索引输入 将非指定字符替换为*
问题原因
你现有代码无法实现预期效果的核心问题有3个:
- 你把存储索引的列表
answer_index额外套了一层列表得到indexes = [(answer_index)],循环时取到的i是整个索引列表,不是单个整数值,无法作为字符串切片的合法索引参数 - 字符串是不可变对象,你每次循环做切片拼接时都是基于原始
word修改单个位置,前一次的修改结果会被后一次覆盖,最终只会保留最后一个索引位置的修改效果 - 替换逻辑和需求相反:你写的逻辑是把目标索引位置替换为
*,但实际需求是除目标字符位置外,其余所有位置替换为*,目标字符位置需要保留原字符
基于你原有写法修正的可运行代码
顺着你原本的编码思路调整,方便初学者理解:
word = 'coffee' print("原字符串:", word) def find(string, char): for i, c in enumerate(string): if c == char: yield i char = "e" answer_index = list(find(word, char)) print("目标字符索引位置:", answer_index) # 先初始化和原字符串等长的全*列表,列表修改比字符串拼接效率更高 new_word_list = ['*'] * len(word) # 遍历所有目标索引,把对应位置改回原字符 for idx in answer_index: new_word_list[idx] = word[idx] # 把列表拼接为最终字符串 new_word = ''.join(new_word_list) print("生成的新字符串:", new_word) print("原字符串值验证:", word)
运行输出结果:
原字符串: coffee 目标字符索引位置: [4, 5] 生成的新字符串: ****ee 原字符串值验证: coffee
全程不会修改原始word变量的值,符合需求要求。
更简便的实现方案
不需要单独写生成器查找索引,直接逐字符遍历判断即可,代码更简洁可读性更高:
word = 'coffee' char = "e" new_word = ''.join([c if c == char else '*' for c in word])
这段代码的逻辑是:遍历原字符串的每一个字符,如果当前字符等于目标字符char就保留,否则替换为*,最后把所有处理后的字符拼接成新字符串,全程不会改动原始word变量。
内容的提问来源于stack exchange,提问作者Raymond Kangas Valencia
相关产品推荐
相关产品推荐

