2017-11-16 7 views
0

私は、この入力を持っている:str.replace()メソッドはどのように機能しますか?

'0472/91.39.17' 

私はこのようなもので'1234567890' 1で私の入力を交換したい:

'1234/56.78.90' 

しかし、私の結果は

0472/91.09.17 

ここに私のコードだある

phone = '0472/91.39.17' 
repl = 1234567890 

for i in phone: 
    if i.isdigit(): 
     for j in str(repl): 
      x = phone.replace(i, j) 
     print(x) 

これを行う適切な方法は何ですか?

+5

よりも高い数値の係数とカウントitertoolsを使用することができます考えていました。ハードコードは '' 1234/56.78.90 ''です。 – scharette

+0

なぜreplを使って反復処理していますか? 'i'がインデックスではないので、動作しないrepl [i] –

+1

@OmarHaqueでiを置き換えたいだけです。たとえそれがインデックスであったとしても、それは毎回「次の文字」と一致しません。 –

答えて

4

replをイテレータに変換し、元の値が数字の場合は、ジェネレータ式を使用してphoneの値をrepliterの次の値に置き換えることができます。その結果として文字列を取得するには、''.joinと一緒に再結合し、Bobさんはあなたの叔父さんです。

repliter = iter(str(repl)) 

result = ''.join(next(repliter) if c.isdigit() else c for c in phone) 
# the ternary expression here evaluates to: 
# if c.isdigit(): 
#  next(repliter) 
# else: 
#  c 

これはあなたの電話番号が10の以上の数字が含まれている場合はStopIterationエラーでクラッシュし、その代わりにrepliterためitertools.cycleの使用を検討することに注意してください。

import itertools 

repliter = itertools.cycle(str(repl)) # 1 2 3 4 5 6 7 8 9 0 1 2 3 ... 
+0

エラーを取り除くためにtry catchでラップすることができます –

+0

"StopIterationを除いて" –

+0

@AustinAを除いて試してみてください。 Pythonでは 'catch 'はありません。しかし、それはあなたに何らかの期待された結果を与えることはありません、それはちょうど安全に終了します。それをしたい場合は、オプションの引数を 'next'で使うことができます。 'next(repliter、0)' –

1

私はあなたの結果は常にあなたがロジックを実装する必要がない理由samething、ある場合には10

from itertools import count 

c = count(0) # start number 
phone = '0472/91.39.17' 

''.join(str(next(c) % 10) if item.isdigit() else item for item in phone) 
関連する問題