1

まず第一に、私はプログラミングの初心者であることを覚えておいてください。

文字列内の子音を子音+「o」+子音に置き換える簡単なプログラムをPythonで作成しようとしています。たとえば、"b" は "bob" に置き換えられ、"d" は "dod" に置き換えられます (したがって、"python" という単語は "popytothohonon" に変更されます)。

これを行うために、b:bob、c:coc、d:dod などのペアを含む辞書を作成しました。次に、replace() コマンドを使用して単語を読み取り、子音を辞書内の翻訳に置き換えました。コード全体は次のようになります。

def replacer(text):
    consonant='bcdfghjklmnpqrstvwxz'
    lexicon={}
    for x in range(0,len(consonant)):
        lexicon[x]=(consonant[x]),(consonant[x]+'o'+consonant[x])
    for i,j in lexicon.items():
        text=(text.replace(i,j))
    return text

今、この関数を呼び出そうとすると、次のエラーが発生します。

Traceback (most recent call last):
  File "D:\x\x.py", line 37, in <module> 
      print(replacer("python"))
  File "D:\x\x.py", line 17, in replacer 
      text=(text.replace(i,j))
TypeError: Can't convert 'int' object to str implicitly

しかし、私はintを使用していません!次のように「手動で」作成するとすべてが機能するため、辞書に何か問題があるに違いありません。

list={'b':'bob', 'c':'coc', 'd':'dod', 'f':'fof', 'g':'gog', 'h':'hoh'......}

しかし、「手作りではない」辞書を印刷すると、すべてが整っているように見えます。

{0: ('b', 'bob'), 1: ('c', 'coc'), 2: ('d', 'dod'), 3: ('f', 'fof')........

私は何を間違っていますか?

4

4 に答える 4

3

lexiconキーとして整数、値としてタプルを持つ辞書です。そのアイテムを反復処理すると、形式のタプルが得られます(integer,tuple)text.replace次に、その整数とタプルをasiに渡します。jこれが文句を言っている理由です。おそらくあなたは次のことを意味しました:

 for i,j in lexicon.values():
     ...

この単純な置換の場合は で問題ありませんが、より複雑な置換の場合は、代わりにを使用str.replaceすると、コードがより堅牢になります (実行速度も向上する可能性があります!) 。re.sub


また、コメントで指摘されているように、この場合、より良いデータ構造は を使用することlistです:

lexicon = [ (x,'{0}o{0}'.format(x)) for x in chars ]

本当に必要な場合は、このリストから辞書を作成できます。

lexicon = dict(enumerate(lexicon))

しかし、おそらく必要はありません。この場合、次のようにlexicon直接繰り返します。

for i,j in lexicon:
    ...

これを 1 回だけ行う場合は、ジェネレーター式を使用してリストを具体化することなく、遅延して実行することもできます。

lexicon = ( (x,'{0}o{0}'.format(x)) for x in chars )
于 2013-04-12T16:42:13.293 に答える
0

あなたが達成したかったのは、子音から置換へのレキシコンマッピングです。次の方法で行うことができます。

lexicon = { c: c+'o'+c for c in consonant }

これは次と同等です:

for c in consonant:
  lexicon[c] = c+'o'+c
于 2013-04-12T17:29:51.117 に答える
0

今回は辞書は必要ありません。テキストの文字を反復処理し、母音または子音+o+子音を結果の配列に追加し、最後に文字列に結合します。

def replacer(text):
    consonants = set('bcdfghjklmnpqrstvwxz')
    result = []
    for c in text:
        if c in consonants:
            result.append(c+"o"+c)
        else:
            result.append(c)
    return "".join(result)

print(replacer("python"))


上級ユーザー向け:

def replacer(text):
    return re.sub(r"[bcdfghjklmnpqrstvwxz]", r"\g<0>o\g<0>", text) 


そして、「私は何を間違っているのですか?」と答えるために。-辞書は任意のキーに役立ちます。通常、辞書でキーlist.append()0〜nを使用することよりも優先されます。また、子音の位置には関心がないため、次のように文字列を直接反復処理できます。

for x in consonant:
    lexicon[x] = x+"o"+x
于 2013-04-12T16:47:52.680 に答える
-1

いいえ...手作りバージョンのキーは文字列です...他のバージョンのケットはintです...intにはreplaceメソッドがありません

于 2013-04-12T16:42:54.530 に答える