2017-05-17 14 views
4

mapとreduceを使って文字列を浮動小数点に変換する関数を作成します。 (ここでint()はありません)。 はここで、これまでに私のコードです:文字列の文字を削除し、辞書を使用してキーの一致を行います

return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[sn] # [s] is the [key] 
KeyError: '' 

「」辞書にないことを意味します

from functools import reduce 

def str2float(s): 
    def char2number(s): 
     s = s.replace('.', '') 
     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] #here i try to get pure numbers 

    def find_digt(s): 
     return (len(s) - s.find('.') - 1) if ',' in s else 0 

    return reduce(lambda x, y: (10 * x + y), (map(char2number, s)))/pow(10, find_digt(s)) 


print(str2float('1456.124')) 

だからこの後、私はエラーを取得します。私がやったいくつかのテストのように:今、

s = s.replace('.', '') 

一度そう

s = '1234.456' 
s = s.replace(',', '') 
print('' in s) #True 

質問 '' ''で置き換えると、 ''をクリアしませんでした。文字列に

私はここで何が起こっているのだろうかと思います。それは不変なので文字列内の文字をクリアする正しい方法は何ですか?

+0

あなたが意図的にS'に「」が '確認したが、その後検索しました'.'のインデックスのために?それはあなたが別のセパレーターを持っていたところが残っているようです。しかし、それは確かに奇妙です。 – MSeifert

+1

これは '。'でなければなりません! –

答えて

1

問題は、あなただけchar2number機能で.を削除するので、あなたが変更されていない入力文字列の上にmapと反復ということです。機能の外では、置換は起こらなかった。

私は位置を見つけ、すぐにそれを交換することを示唆している:

from functools import reduce 

def str2float(s): 
    pos_decimal_point = (len(s) - s.find('.') - 1) if '.' in s else 0 
    s = s.replace('.', '') 

    def char2number(s): 
     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] #here i try to get pure numbers 

    return reduce(lambda x, y: (10 * x + y), 
        (map(char2number, s)))/pow(10, pos_decimal_point) 


print(str2float('1456.124')) 
1

私は些細なトレースステートメントを追加:

def char2number(s): 
    print ("ENTER", s) 
    s = s.replace('.', '') 
    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] 

出力:

ENTER 1 
ENTER 4 
ENTER 5 
ENTER 6 
ENTER . 
Traceback (most recent call last): 
    File "so.py", line 15, in <module> 
    print(str2float('1456.124')) 
    File "so.py", line 12, in str2float 
    return reduce(lambda x, y: (10 * x + y), (map(char2number, s)))/pow(10, find_digt(s)) 
    File "so.py", line 7, in char2number 
    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] #here i try to get pure numbers 
KeyError: '' 

あなたはchar2numberに '1234.456' の個々の文字を渡します。ドットを渡すと、に置き換えられ、空文字列が残ります。

私はあなたがこれをどのように動作させるのかよく分かりません。あなたは文字列全体がサポート関数に送られると思うようです。ただし、mapは、繰り返し可能な要素のシーケンスに作用します。

文字列の変更に関しては、実際には:のように行い、replaceの出力を元の文字列に戻すことはできません。あなたが持っていた問題は、コード内のその時点で1文字で動作するということでした。

1

あなたは自分のmap関数に渡す前s.を置き換える、正しい考えを持っている:

map(char2number, s.replace('.','')) 

注:find_digt()にタイプミスがあります。if '.' in s...です。
あなたもカンマを処理したい場合は、それらをノックアウトするために余分なreplaceを追加します。

stripped_s = s.replace('.','').replace(',','') 
return reduce(lambda x, y: (10 * x + y), (map(char2number, stripped_s)))/pow(10, find_digt(s)) 

print(str2float('1,456.124')) 
1456.124 

全コード:

def str2float(s): 
    def char2number(s): 
     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] 

    def find_digt(s): 
     return (len(s) - s.find('.') - 1) if '.' in s else 0 

    stripped_s = s.replace('.','').replace(',','') 
    return reduce(lambda x, y: (10 * x + y), (map(char2number, stripped_s)))/pow(10, find_digt(s)) 

    print(str2float('1,456.124')) 
    1456.124 
関連する問題