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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:00:49