1

私の宿題の一部は、 のような文字列を解析'-.4e-4'し、float へのキャストを妨げる問題を特定する関数を作成することです。たとえば'10e4.5'、指数の小数を検出し、関連するエラー メッセージを提供する必要があります。

私は多くのことを試みました。最初の、そしてもちろん最も基本的なのは、try: except: です。それを float にキャストして、Python に面倒な作業を任せてみてください。ただし、私が見る限り、返される可能性のあるエラーは、この割り当てに対して十分に説明的ではありません。

次に試したのは、すべての数字を n に、符号を s に、小数を d に、指数を e に置き換えて、文字列を正規化することでした (C の maketrans 関数により、これは非常に高速になりました)。次に、繰り返される n を 1 つの n に切り詰めます。すべての有効な float 形式のリストを作成し、正規化された文字列がそのリストに含まれているかどうかを確認しました。別名、ホワイトリストに登録しました。それは完全に、かなり時間効率よく機能しましたが、やはりエラーチェックはありませんでした。そのコードは以下に掲載されています。

import string,time
check_float_trans = string.maketrans("nsd0123456789-+.","???nnnnnnnnnnssd")
check_float_valids = 'n sn sndn ndn ndnen dn sdn sdnen sdnesn dnesn dnen nen nesn snesn sn snen sndnen sndnesn ndnesn'.split()
def check_float( test ):
    """Check if string <test> could be cast as a float, returns boolean."""
    test = test.translate(check_float_trans)
    test = ''.join([a for a,b in zip(test, ' '+test) if a != b])
    return test in check_float_valids

ここの誰かが私にいくつかの指針を教えてくれることを望んでいました。私はこれを私に渡したくないのですが、私は比較的立ち往生しています。文字列がフロートとしてキャストできない理由を特定しようと、ガーディアン コーディングを試みましたが、不良文字列が誤検出されないようにするのに十分な壁を設けることができませんでした。

ありがとう。

4

1 に答える 1

0

これが私がすることです...(これもテストされていません)

def isValid(expression):

    if 'e' in expression:
        number, exponent = expression.split('e')
    else:
        print "not a valid format, no 'e' in expression"
        return False

    # a bunch of other if statments here to check for
    #certain conditions like '.' in the exponent component

    return float(number) ** float(exponent)


if __name__ == '__main__':
    print isValid('-.4e-4')
    print isValid('10e4.5')
于 2012-10-23T01:41:59.533 に答える