2016-07-21 10 views
0

私は、.csvファイルを読み込んで各値をリスト[list] [x] [y]に格納するPythonスクリプトを持っています。私はこれに何ら問題はありません。Pythonリストの項目がint/numberであるかどうかを確認します。

これらのフィールドのいずれかをチェックして、数字(整数)かどうかを確認します。

私はprint type(list[i][0])を実行すると、それは価値が以下の文はリストを反復forループでそう、私がやって考えていたが、チェックをしているしている場合は100

ザ・言っているにもかかわらず<type 'str'>を返します。

if type(list[i][0] == types.IntType): 
    True 
else: 
    False 

は、したがって、これは私が

# check if a value is entered 
if list[i][0] != '': 
    if isinstance(int(list[i][0]), int): 
     True 
    else: 
     False 
else 
    False 
にそれを変更した、しかしそれはPEP8に眉をひそめていますので、私は isinstance()を使用する必要があり、動作します

しかし、文字列をintに変換しようとすると(ユーザーが文字列を入力した場合)問題にぶつかります。

どうすればこの問題を解決できますか?しかし、単純な問題のように思えますが、私はPythonには初めてのので、これに対処するきれいで効率的な方法が不思議でした。リストに値を格納する前に、その値がintかどうかを確認する必要がありますか?

私はPython2を使用しています。

おかげ

編集:私は試し例外キャッチ周りisinstance()チェックをラップしているしかし、私は何かがint型であるかどうかだけをチェックするためにこれに頼る必要はありませんように感じますか?これを行うためのより純粋な方法があるかどうか不思議です。

編集:私は前述のようにisdigitを使用しましたが、私は否定的な結果を得ていました。

つまりこのデータセットが指定されています。リスト[0] [0] = 123、リスト[1] [0] =

for i in range(0, 1): 
    if (list[i][0]).isdigit: 
     tempInt = list[i][0] 
     print type(tempInt) 
     print 'True: ' + tempInt 
    else: 
     tempInt = 1 
     print 'False: ' + tempInt 

結果asdasd:あなたはこれでそれを確認することができます

<type 'str'> 
True: 123 
<type 'str'> 
True: asdasd 
+0

重複が間違っていると思います。確かに '' 123 "を' 'somestring.isdigit'でチェックする' 123 'に変換するか、' int(somestring) 'で変換するかを確かめてください。 –

+0

@ReutSharabaniはい、あなたは正しいです、その重複した質問は私の問題に関連していません – Brendan

+0

私はその質問の答えを通して読むことをお勧めします。あなたは[isdigit()を特に言及するもの]を見つけるでしょう(http://stackoverflow.com/a/23464130/2617068)。 – TigerhawkT3

答えて

1

を - これは、すべての数字のためである(正と負の整数、浮動小数点数、ナン)は、intまたは特定のサブクラスに対してのみ、より良いアプローチが存在する可能性があります。

def is_number(a): 
    # will be True also for 'NaN' 
    try: 
     number = float(a) 
     return True 
    except ValueError: 
     return False 

顔の値では、見栄えが良くありません。しかし、すべての数値(負、浮動小数点、整数、無限大など)を考慮したい場合は、おそらくこれが最良の方法だと思います。詳細/投票質問/回答hereが表示されます。また、すべての場合にisdigitが機能しないことに注意してください。

+0

ありがとう、私は私のポストにそれを追加するのを忘れました。はい、私はそれが動作していると考えましたが、値がintであるかどうかをチェックするために例外をキャッチしなければならないと少し気にかけました。 – Brendan

+0

この回答は間違っています。誤って '1.2'のような値を受け取ります。これは、OPが望むように整数ではありません。なぜあなたは 'float()'を使っていますか? – TigerhawkT3

+0

タイトルに 'int/number'があります。私はOPが数学的な意味ですべての数を考慮したいと思う。 – DurgaDatta

0

次のアプローチは、整数のみのために返されます:

[True, True, False, False, False, False, True] 

をトリックが丸くなる(最初のフロートに文字列をキャストして整数にそれを変換することです:与える

string_list = ['20.0', '100', 'abc', '10.3445', 'adsfasdf.adsfasdf', '10,3445', '34,0'] 

def check(inp): 
    try: 
     inp = inp.replace(',', '.') 
     num_float = float(inp) 
     num_int = int(num_float) 
     return num_int == num_float 
    except ValueError: 
     return False 

print([check(s) for s in string_list]) 

小数部がゼロでない場合はfloat)。その後、入力の整数表現と浮動表現を比較して、入力が整数かどうかを調べることができます。 カンマを使用してヨーロッパとアメリカ/英数字の両方の10進表記をサポートするために、.replace()を追加しました。

関連する問題