2016-03-19 20 views
1

Iは、特定の入力は、次のカテゴリのいずれか文字列オブジェクトが整数、倍精度、ブール値、日付、または文字列であるかどうかを判断する方法は?

  • 整数
  • ダブル
  • ブール
  • 日付
  • ストリング
に該当するかどうかを決定することができる機能を希望します

これは私が現在持っている関数ですが、入力が文字列として出てきたらfuncまだそれは例えば、日付、整数、倍精度、ブール値、または文字列

def text_type_determine(i): 
    if type(i) == int: 
     return 'integer' 
    elif type(i) == float: 
     return 'double' 
    elif type(i) == bool: 
     return 'boolean' 
    elif type(i) == str: 
     return 'string' 

だ場合、私は、関連する結果得るために、以下の入力を希望するかを決定ン:

  • 「を2015から01 -01' - > '日付'
  • '1' - > '整数'
  • '1.0' - > 'double' の
  • '真' - > 'ブール'
  • 'ランダムな文字列' - >文字列
+2

あなたはこれを自分で行う方法について考え始めましたか?このサイトは、たとえ丁寧に質問されても、単純な「私にいくつかのコードを渡す」という質問には嫌われがちです。 –

答えて

0

あなたはこのようevalを使用することができます。

def text_type_determine(i): 
    i = eval(i) 
    if type(i) == int: 
     return 'integer' 
    elif type(i) == float: 
     return 'double' 
    elif type(i) == bool: 
     return 'boolean' 
    elif type(i) == str: 
     return 'string' 

ので、この:

print(text_type_determine("12.3")) 

なり出力:

double 
+0

文字列として来るのは、*唯一のものではなく、* second *の代替です。 'i'は' 4.5 'であり、その場合は 'eval(i)'行にエラーが発生します。 – zondo

+0

文字列の場合はそのまま編集し、それ以外の場合はtype()をチェックします。 –

0

あなたはのtry/catchで変換をテストすることができます命令として(の場合のみ):あなたは論理的に連続して、様々なタイプの各項目をキャストして、すべてのケースを処理しようとすることができ

def isInt(s): 
    try: 
     int(s) 
     return True 
    except ValueError: 
     return False 

def text_type_determine(s): 
    if isInt(s): 
     return 'integer' 
0

from datetime import datetime 

def text_type_determine(i): 
    # datetime is the most specific, so start with it 
    try: 
     datetime.strftime(i, '%Y-%m-%d') 
     return 'date' 
    except: 
     # Next try int before float since float(`4`) will work 
     try: 
      int(i) 
      return 'integer' 
     except: 
      try: 
       # Python uses float not double, but I think it should do 
       float(i) 
       return 'double' 
      except: 
       pass 
    # Finally if all our number cases fail, check if 
    # we have a boolean, otherwise it's just a string 
    if i in ['true', 'false']: 
     return 'boolean' 
    return 'string' 

このコースの日付がフォーマットYYYY-MM-DDでのみであり、ことあることを前提としていすべてのブール値はtrueまたはfalseのいずれかになります。より多くのオプションを追加するのはかなり簡単です。

0

自分のコードには表示されませんが、潜在的なintを評価したい場合は、文字列である浮動小数点数など、日付の意味が分かりません。あなたを与えるだろう

from dateutil import parser 
from datetime import datetime 

def text_type_determine(i): 
    types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string', datetime: "date"} 
    for tpe in [literal_eval, parser.parse]: 
     try: 
      return types.get(type(tpe(i))) 
     except (AttributeError, ValueError): 
      pass 
    return types.get(type(i)) 

In [17]: text_type_determine(1) 
Out[17]: 'integer' 

In [18]: text_type_determine(datetime.now()) 
Out[18]: 'date' 

In [19]: text_type_determine("2016-03-19") 
Out[19]: 'date' 

In [20]: text_type_determine("2016") 
Out[20]: 'integer' 

In [21]: text_type_determine("2016.23") 
Out[21]: 'double' 
オブジェクトを日付として解析することができれば、あなたのようなもので dateutilを使用することができますテストしたい場合は、 ast.literal_eval

from ast import literal_eval 

def text_type_determine(i): 
    types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string'} 
    try: 
     return types.get(type(literal_eval(i))) 
    except ValueError: 
     return types.get(type(i)) 

使用することができます

dateutil.parserが予期しない出力を与える可能性があるため、確認の順序を並べ替えることができます。あなたの日付が常に同じ順序になっている場合、構文解析にはdatetime.strptimeを使用してください。そうでない場合は、strptimeを使用して日付のバリエーションを試してみてください。

関連する問題