2017-04-17 16 views
2

私はreplaceメソッドを理解しようとしています。私はいくつかの調整をしたい数字の文字列を持っています。正しくループしてstringの要素を置き換える方法は?

def makeAdjustment(x): 
    for each in x: 
     if int(each) < 5: 
      x = x.replace(each, "0") 
     else: 
      x = x.replace(each, "1") 
    return x 

使用では:数列が大きくなる場合

>>> makeAdjustment("800857237867") == "100111001111" 
True 
>>> makeAdjustment("15889923") == "01111100" 
True 
>>> makeAdjustment("14963896") == "00110111" 
True 

ただし、文字列はゼロに変換されます

>>> makeAdjustment("366058562030849490134388085")  
'000000000000000000000000000' 
特に、私は、しきい値に基づいて数字を分類します
+3

考えてみましょう - 5つ以上の数字を1つに置き換えた後、**すべての数字は5未満**です。 – jonrsharpe

+0

'replace'メソッドは、substring oldがすべてnewで置き換えられた文字列のコピーを返します。最終的にはすべてがゼロになっています。 – Charul

+1

それぞれが正しい数字ですか? replaceは、その位置の番号だけでなく、すべての番号を置き換えます。あなたはそれをポジションしたいですか? – jwillis0720

答えて

3

ここでの問題は、文字列が大きいということではなく、'1'または'0'のインスタンスを置き換えないことです。後で文字列に'1'が出現すると、前のすべてのインスタンス'1''0'に置き換えられます。

一つの解決策は、特殊なケースにそれらである:

def makeAdjustment(x): 
    for each in x: 
     if int(each) in {'1', '0'}: 
      continue 
     if int(each) < 5: 
      x = x.replace(each, "0", 1) 
     else: 
      x = x.replace(each, "1") 
    return x 

これは、1つのオプションですが、あなたはすべての反復ためreplaceを呼んでいるので、それが最善ではありません。あなたはそれぞれの文字を置換したい場合は、

# for loop 
%timeit makeAdjustment("366058562030849490343880185") 
10000 loops, best of 3: 39.1 µs per loop 
# join 
%timeit makeAdjustment("366058562030849490343880185") 
100000 loops, best of 3: 17.7 µs per loop 
2

文字で新しい文字列の文字を構築する代わりに:

クリーナーです
def makeAdjustment(x): 
    return "".join("1" if int(i) > 5 else "0" for i in x) 

、明確かつ迅速に:あなたはちょうどここjoinを使用して、より良いを行うことができますreplace使用:

def makeAdjustment(x): 
    result = [] 
    for each in x: 
     if int(each) < 5: 
      result.append("0") 
     else: 
      result.append("1") 
    return ''.join(result) 

やショートで:

def makeAdjustment(x): 
    return ''.join("0" if int(each) < 5 else "1" for each in x) 
1

私のやり方は、それをリストにして、位置を変えるだけです。 全ての各文字ここで位置は、我々はリストに

def makeAdjustment(x): 
    x = list(x) 
    for each in range(len(x)+1): 
     if int(x[each]) < 5: 
      x[each] = '0' 
     else: 
      x[each] = '1' 
     #Turn it back into a string instead of a list 
     x = "".join(x) 
     return x 
1
def makeAdjustment(x): 
    splitted = [c for c in enumerate(x)] 
    for each in splitted: 
     if int(each[1]) < 5: 
      splitted[each[0]] = "0" 
     else: 
      splitted[each[0]] = "1" 

    return "".join(splitted) 

EDITを私たちの場所を追跡するための指標として、それぞれを使用するに関係なく交換される交換するので、それはとても簡単です:上記のコードの分割文字列内の各文字に添え字が付いたタプルのリストを作成します。これはenumerateを使用して行われます。

each[1]には文字列の実際の文字が含まれ、each[0]には指定された文字列の実際の文字のインデックスが含まれます。リスト(splitted)が列挙されます。

each[1]に含まれる値に基づいて、each[0]に含まれる値が変更されます。

最後に、文字列は"".join(splitted)を使用して結合されます。

+0

解決策を説明する文章をいくつか追加できますか?多くの人にとって、コードを見るだけでは役に立ちません。 –

+1

@JimFasarakisHilliard:説明を追加しました。 pythonicを感じないが、仕事を終わらせる。 – shahkalpesh

関連する問題