这里的问题是,第一次出现的find()
回报指数的元素。
您可以使用下面的代码来代替事件。
>>> word = 'abcdabcd'
>>> ignore = 'ab'
>>> "".join([elem if elem not in ignore else '_' for elem in word])
'__cd__cd'
P.S - 你目前的代码一些指点。
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 = ['_']*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'
哪给了我们我们想要的东西。
只需添加一个while循环来检查y。你将不得不划掉词中的创建字符。 – Jiminion
我不明白你想要做什么。你能举个例子吗? –
'word.replace('x','y')'有什么问题?你的代码对我来说不清楚,它非常复杂,但很少。 –