2016-03-04 18 views
5

パラメータ(文字、stringOne、stringTwo)を取得する関数を作成する必要があります。この関数は、同じ位置にあるstringOne内のどの文字でも、stringTwo +と同じデータを含む新しい単語を返します。文字列1から文字列2への文字の置換

例:

  • stringOne = "りんご"
  • stringTwo = "12345"
  • 文字= "P"
  • は "1pp45"

私は失われています返す必要がありますどのように進むべきか

def replace(char, word1, word2): 
newWord = "" 
for s in range(len(word1)): 
    if word1[s] == char: 
return 
+4

コード例のインデントを修正する必要があります。 – Carpetsmoker

答えて

2
ここ

それはあなたが望むものとするよう、既存のコードを変更する方法を説明します。 newWordnew_wordに変更して、標準のPythonスタイルの規約に準拠させました。 word1word2よりも短い場合、このコードは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ジェネレータに渡すと、ジェネレータからの一時的なリストを作成する必要があります。

1

また、リストの理解度を使用して、反復して置換することもできます。

>>> x, y, c = 'apple', '12345', 'p'    
>>> ''.join([c if x[i] == c else s for i, s in enumerate(y)]) 
'1pp45' 
+0

これは、プログラムを習得するのに苦労している誰かに示すコードのようなものではありません。 – Carpetsmoker

1

Python的な方法は:

>>> stringOne = "apple" 
>>> stringTwo = "12345" 
>>> my_char = "p" 
>>> "".join([x[1] if my_char!=x[0] else x[0] for x in zip(stringOne, stringTwo)]) 
'1pp45' 
5

はシンプルfor-loopと三元操作を使用して、あなたがやっていることを続けて、これはそれを行うことができる方法です。と等価です

def replace(char, word1, word2): 
    newWord = "" 
    for s in range(len(word1)): 
     newWord += char if word1[s] == char else word2[s] 
    return newWord 

def replace(char, word1, word2): 
    newWord = "" 
    for s in range(len(word1)): 
     if word1[s] == char: 
      newWord += char 
     else: 
      newWord += word2[s] 
    return newWord 

三項演算に慣れていない場合に備えて。

1
def replace(char, word1, word2): 
    newWord= list(word2) 
    for counter in range(min(len(word1), len(word2))): 
      if word1[counter]== char: 
        newWord[counter]= char 
    return "".join(newWord) 
0

最も簡単な解決策は、WORD1の文字を反復処理し、文字の一致が、我々は見つけることに興味を持っている文字を発見された場合、我々はWORD2にそのインデックスの文字を置き換えることであろう。

def replace(char, word1, word2): 
    newWord = "" 
    word2List = list(word2) 
    # Check is character is present in word1 
    # and if length of word1 and word2 are equal 
    if char not in word1 or len(word1) != len(word2): 
     return False 
    else: 
     for i,c in enumerate(word1): 
      if c == char: 
       word2List[i] = c 



    # Converting list back to string 
    return ''.join(word2List) 

print(replace('p','apple','12345')) 

出力:

1pp45 
関連する問題