0

だから私はPythonの初心者で、この演習を行っていました:

「テキストを "rövarspråket" (スウェーデン語で "強盗の言葉") に翻訳する関数 translate() を作成します。つまり、すべての子音を 2 倍にし、その間に "o" を挿入します。たとえば、translate("これはfun") は文字列 "tothohisos isos fofunon" を返す必要があります。"

ここでそれを行うことができたのは私のコードです:

def translate (var1):
    vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
    var1 = list(var1)
    for string  in var1:
        if string == string in vaw:
           var1[var1.index(string)] = string + 'o' + string
    print ''.join(var1)

これが正しいのか、それともより少ないコードでそれを行う別の方法があるのか​​ 疑問に思っていましたか?

4

3 に答える 3

9
def translate(s):
  consonants = 'bcdfghjklmnpqrstvwxz'
  return ''.join(l + 'o' + l if l in consonants else l for l in s)

print(translate("this is fun"))
于 2013-03-13T21:25:44.673 に答える
5

正規表現は良い解決策です

>>> import re
>>> print re.sub(r"([bcdfghjklmnpqrstvwxyz])",r"\1o\1","this is fun")
tothohisos isos fofunon
于 2013-03-13T21:32:16.323 に答える
1

まず、これを行う必要はありません。

vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']

…文字のシーケンスを取得します。文字列はすでに一連の文字です。(同じことが にも当てはまりますが、そこでは、任意の文字をより長い文字列に置き換えることができる変更可能な文字シーケンスがコードで必要とされるため、var1必要です。)list

また、常に false である とstring == string in vaw同じであるため、コードは実際には機能しません。True in vaw私はあなたが意味したと思いますif string in vaw。変数stringは組み込みモジュールの名前なので、ここでは呼び出しません。

また、標準の Python スタイル (PEP8) で不要とされている場所に余分な空白を追加しないことで、いくつかのキーストロークを節約できます。:)

そう:

def translate(var1):
    vaw = 'bcdfghjklmnpqrstvwxz'
    var1 = list(var1)
    for s in var1:
        if s in vaw:
           var1[var1.index(s)] = s + 'o' + s
    print ''.join(var1)

次に、 の各要素のインデックスが必要な場合はvar1、それを捨てずに で再度検索しindexます。コードが増えて遅くなるだけでなく、複数回出現する要素に対して間違った答えを返すことにもなります。そう:

def translate(var1):
    vaw = 'bcdfghjklmnpqrstvwxz'
    var1 = list(var1)
    for i, s in enumerate(var1):
        if s in vaw:
           var1[i] = s + 'o' + s
    print ''.join(var1)

varこれは、リストをその場で変更したい場合にできる限りのことです。dovar1[i+1:i+1] = 'o' + sに変更して、既存の要素の後に新しい要素を挿入することもできますが、コピーを反復処理する必要がありvar1(反復処理中に形状を変更することはできません)、追跡する必要があります。インデックスがどのように変化したかなど。

通常、古い構造をその場で変更するよりも、新しい構造を構築する方がはるかに簡単です。それが、リスト内包表記、ジェネレータ式、mapfilterなどの目的です。s元のリストの各要素について、それが にある場合、それ以外s + 'o' + sの場合は必要ですよね? その権利を Python に変換できます。vaws

def translate (var1):
    vaw = 'bcdfghjklmnpqrstvwxz'
    new_var1 = (s + 'o' + s if s in vaw else s for s in var1)
    return ''.join(new_var1)
于 2013-03-13T21:29:34.800 に答える