0

単語内の特定の文字を検索し、生成された文字列でそれらの文字を置き換える必要があるコードに取り組んでいます。単語に各文字が 1 つしかない場合、コードは正常に機能します。ただし、同じ種類の文字が 2 つ以上ある場合、コードは最初の文字のみを識別し、次の文字は無視します。この問題を解決する方法について何か提案はありますか?

def write_words (ワード、アル):

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)

(私が使用している Python のバージョンは 3.2.1 です)

4

3 に答える 3

1

ここでの問題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)
  1. forループを実行して a の_すべての要素に追加する代わりに、a = ['_']*len(word).
  2. ここで 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'

私たちが望むものを与えてくれます。

于 2013-08-03T19:23:34.800 に答える
0

find関数を次のように置き換えます。

def myfind(main, x):
    return [i for i,j in enumerate(x) if j==x]

あなたのコードで:

ys = myfind( word, z )
for y in ys:
    a[y] = z
于 2013-08-03T19:25:11.370 に答える
0

これは、元のコードへの最小限の変更で、OP が要求したことを実行する必要があります。「_」が al で許可されている文字の場合は機能しません。

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)
        while (y >= 0):
            print (y)
            a[y] = z
            word[y] = "_"
            y = word.find(z)
        x = x + 1
    return a
于 2013-08-03T19:26:05.747 に答える