1

整数値のみを評価する関数を作成するために使用したい単純な csv ファイルがあります。以下はコードです:

def type_setter(x):                                                                                                                           
    x = list(x)                                                                                                                               
    for i in x:                                                                                                                               
        for j in i :                                                                                                                          
            print type(j)                                                                                                                     
            if isinstance(j,int)==True:                                                                                                       
                eval(j)                                                                                                                   

    return x

問題は、j値が整数と文字列の混合ではなく、すべて文字列変数として認識されることです。なぜこれが起こっているのですか?

4

2 に答える 2

1

すべてのフィールドは文字列です。isinstance(j, int)常に を返すため、使用できませんFalse

str.isdigit代わりに使用してください:

>>> '1234'.isdigit()
True
>>> 'abcd'.isdigit()
False
>>> '-1234'.isdigit()
False
>>> '-1234'.lstrip('-').isdigit()
True

または、try-except を使用するヘルパー関数を次のように作成しますint

def is_int(x):
    try:
        int(x)
    except ValueError:
        return False
    return True

例:

>>> is_int('1234')
True
>>> is_int('xyz')
False
>>> is_int('-1')
True
于 2013-09-15T05:05:29.303 に答える
0

Python では、 look before you jumpではなく、許可を求めるよりも許しを求めるほうに傾く必要があります。

言い換えれば、最初にできるかどうかをチェックするのではなく (例えば、jump する前に調べる)、着信トークンを整数に変換して処理できるかのように処理を進める必要があります。変換できない場合は、ValueErrorがスローされます。これをキャッチして却下できます (許しを求める部分)。

for token in tokens:
 try:
   process(int(token))
 except ValueError:
   continue

Python のドキュメントには、ダック タイピングについて次のように書かれています。

ダックタイピング

オブジェクトの型を見て、適切なインターフェースを持っているかどうかを判断しないプログラミング スタイル。代わりに、メソッドまたは属性は単に呼び出されたり使用されたりします (「アヒルのように見えてアヒルのように鳴く場合、それはアヒルに違いありません。」) 特定の型ではなくインターフェイスを強調することにより、適切に設計されたコードは、多形置換。ダックタイピングは、type() または isinstance() を使用したテストを回避します。(ただし、ダックタイピングは抽象基本クラスで補完できることに注意してください。)代わりに、通常は hasattr() テストまたは EAFP プログラミングを使用します。

EAFP プログラミングは次のように定義されます。

EAFP

許可よりも許しを求める方が簡単です。この一般的な Python コーディング スタイルは、有効なキーまたは属性が存在することを前提としており、その前提が偽であることが判明した場合に例外をキャッチします。このクリーンで高速なスタイルの特徴は、多くの try ステートメントと except ステートメントが存在することです。この手法は、C などの他の多くの言語に共通する LBYL スタイルとは対照的です。

于 2013-09-15T05:34:26.363 に答える