这里的问题是find()
返回元素第一次出现的索引。
您可以只使用以下代码来替换出现的情况。
>>> word = 'abcdabcd'
>>> ignore = 'ab'
>>> "".join([elem if elem not in ignore else '_' for elem in word])
'__cd__cd'
PS - 关于您当前代码的一些指针。
def write_words (word, al):
newal = (list(al))
n = len(word)
i = 0
x = 0
a = []
b = ["_"]
for i in range(0, n):
a = a + b
while (x <(len(newal))):
z = newal[x]
y = word.find(z)
x = x + 1
print (y)
if y >= 0:
a[y] = z
return(a)
- 与其做一个
for
循环并_
在 a 中的每个元素上附加,你可以只做a = ['_']*len(word)
.
- 您不需要在此处使用 while 循环或将您的单词转换为
list
. 字符串是可迭代的,所以你可以只做for elem in newal
. 这样你就不必保留一个单独的x
变量来迭代字符串。
所以,现在你的代码减少到
>>> def write_words_two(word, al):
a = ['_']*len(word)
for elem in al:
y = word.find(elem)
print(y)
a[y] = z
return a
但是,它仍然存在与以前相同的问题。现在的问题似乎是word.find(elem)
只返回第一个字符的出现而不是所有字符出现的索引。所以,与其先建立一个列表然后替换字符,我们应该建立一个列表,并测试我们忽略的字符的每个字符,如果需要忽略该字符,我们只需将其替换为替换在列表中。然后,我们想出了下面的代码
>>> def write_words_three(word, al, ignore):
a = []
for elem in word:
if elem in al:
a.append(ignore)
else:
a.append(elem)
return a
>>> write_words_three('abcdabcd', 'ab', '_')
['_', '_', 'c', 'd', '_', '_', 'c', 'd']
但是,它似乎仍然返回列表而不是字符串,这就是我们想要的,而且它似乎也有点大。那么,为什么不用列表理解来缩短它呢?
>>> def write_words_four(word, al, ignore):
return [elem if elem not in al else ignore for elem in word]
>>> write_words_threefour('abcdabcd', 'ab', '_')
['_', '_', 'c', 'd', '_', '_', 'c', 'd']
尽管如此,我们仍然需要一个字符串,我们的代码只返回一个列表。我们可以使用该join(...)
方法并连接字符串的每个元素。
>>> def write_words_five(word, al, ignore):
return "".join([elem if elem not in al else ignore for elem in word])
>>> write_words_five('abcdabcd', 'ab', '_')
'__cd__cd'
这给了我们想要的东西。