ここでの問題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'
私たちが望むものを与えてくれます。