ここ
それはあなたが望むものとするよう、既存のコードを変更する方法を説明します。 newWord
をnew_word
に変更して、標準のPythonスタイルの規約に準拠させました。 word1
がword2
よりも短い場合、このコードはIndexError: string index out of range
例外を発生することを
def replace(char, word1, word2):
new_word = ""
for i in range(len(word2)):
if word1[i] == char:
new_word += char
else:
new_word += word2[i]
return new_word
# Test
print(replace("p", "apple", "12345"))
出力
1pp45
注意。
この機能を実装するさまざまな方法があります。まず、zip
関数を使用して、両方の文字列の文字を並行して反復処理することができます。これは、文字にアクセスするために文字列のインデックスを使用する間接反復よりも少し面白いです。文字列が同じ長さでない場合、短い文字列が終了すると、その後zip
が正常に停止することを
def replace(char, word1, word2):
new_word = ""
for c1, c2 in zip(word1, word2):
if c1 == char:
new_word += char
else:
new_word += c2
return new_word
は注意してください。
if... else
ブロックを条件式に置き換えることで、そのコードをよりコンパクトにすることができます。
def replace(char, word1, word2):
new_word = ""
for c1, c2 in zip(word1, word2):
new_word += char if c1 == char else c2
return new_word
より高度なバージョンが必要な文字のリストや文字列にそのリストを変換する文字列.join
方法を構築するために、リスト内包表記を使用しています。
def replace(char, word1, word2):
return ''.join([char if c1 == char else c2
for c1, c2 in zip(word1, word2)])
ジェネレータ式を使用してこれを行うこともできます。
''.join(char if c1 == char else c2 for c1, c2 in zip(word1, word2))
は、しかしそれが原因.join
作品そのように、リストの内包表記を使用するよりも効率的です。 .join
は引数を2回スキャンする必要があります。最初のスキャンは出力文字列の合計サイズを計算するために使用され、2回目のスキャンは実際の結合を行います。しかし、ジェネレータを2回スキャンすることはできません。したがって、.join
ジェネレータに渡すと、ジェネレータからの一時的なリストを作成する必要があります。
コード例のインデントを修正する必要があります。 – Carpetsmoker